home *** CD-ROM | disk | FTP | other *** search
/ The World of Computer Software / The World of Computer Software.iso / ccr.zip / CCR-ROOM.T < prev    next >
Text File  |  1993-01-23  |  119KB  |  4,592 lines

  1. /*
  2.  * Colossal Cave Revisited
  3.  *
  4.  * A remake of Willie Crowther and Don Woods' classic Adventure.
  5.  * Converted from Donald Ekman's PC port of the original FORTRAN source.
  6.  * TADS version by David M. Baggett for ADVENTIONS.
  7.  *
  8.  * Please document all changes in the history so we know who did what.
  9.  *
  10.  * This source code is copylefted under the terms of the GNU Public
  11.  * License.  Essentially, this means that you are free to do whatever
  12.  * you wish with this source code, provided you do not charge any
  13.  * money for it or for any derivative works.
  14.  *
  15.  * ADVENTIONS distributes this game, but you are free to do what you will
  16.  * with it, provided you adhere to the terms in the GNU Public License.
  17.  * Send correspondence regarding this game or original works distributed
  18.  * by ADVENTIONS to 
  19.  *
  20.  *    ADVENTIONS
  21.  *    PO Box 851
  22.  *    Columbia, MD 21044
  23.  *
  24.  * If you would like a catalog of releases, please enclose a SASE.  Thanks!
  25.  *
  26.  * Contributors
  27.  *
  28.  *    dmb    In real life:    David M. Baggett
  29.  *        Internet:    <dmb@ai.mit.edu>
  30.  *        Compu$erve:    76440,2671 (ADVENTIONS account)
  31.  *        GEnie:        ADVENTIONS
  32.  *
  33.  * Modification History
  34.  *
  35.  * 1-Jan-93    dmb    rec.arts.int-fiction BETA release (source only)
  36.  *                      For beta testing only -- not for general
  37.  *            distribution.
  38.  *
  39.  */
  40.  
  41. /*
  42.  * This file defines all the locations.
  43.  */
  44.  
  45. /*
  46.  * First we need to define a new class for our rooms.
  47.  * In the original fortran version of the game, you could move around
  48.  * by naming adjacent places.  Since we want to retain this capability,
  49.  * we need to augment the existing set of room movement methods.
  50.  *
  51.  * We also make rooms dark by default.
  52.  *
  53.  * We also need a few things to help our NPC's move about the cave
  54.  * without getting stuck or wandering where they're not supposed to.
  55.  *
  56.  * IMPORTANT NOTE: If you add exit properties (i.e., things like
  57.  * out, east, down, etc.), be sure to update the exitlist in ccr-npc.t
  58.  * or NPC's won't know to look at them, and might get stuck!
  59.  */
  60. class CCR_room: darkroom
  61.     //
  62.     // By default, exits don't go anywhere.
  63.     //
  64.     // The directional ones call noexit, the standard TADS
  65.     // "You can't go that way" method.
  66.     //
  67.     // The magic words print "Nothing happens."
  68.     //
  69.     // For the other words, the game tells the player it
  70.     // doesn't know how to apply the word in the given
  71.     // location.
  72.     //
  73.     jump = { "I don't see how that will help here."; return nil; }
  74.  
  75.     //
  76.     // Directions
  77.     //
  78.     upstream = { return self.noexit; }
  79.     downstream = { return self.noexit; }
  80.     forwards = { return self.noexit; }
  81.     outdoors = { return self.noexit; }
  82.     left = { return self.noexit; }
  83.     right = { return self.noexit; }
  84.     cross = { return self.noexit; }
  85.     over = { return self.noexit; }
  86.     across = { return self.noexit; }
  87.  
  88.     //
  89.     // Magic words
  90.     //
  91.     // Note that it's important to have these implemented as travel
  92.     // verbs because once the cave closes, these stop working just
  93.     // like the usual travel verbs.
  94.     //
  95.     // Non-travel magic words are defined in ccr-verbs.t
  96.     //
  97.     xyzzy = { return self.nothinghappens; }
  98.     y2 = { return self.nothinghappens; }
  99.     plugh = { return self.nothinghappens; }
  100.     plover = { return self.nothinghappens; }
  101.  
  102.     //
  103.     // Feature names
  104.     //
  105.     // These allow limited teleporting to prominent locations.
  106.     //
  107.     road = { return self.doesnotapplyhere; }
  108.     forest = { return self.doesnotapplyhere; }
  109.     valley = { return self.doesnotapplyhere; }
  110.     stairs = { return self.doesnotapplyhere; }
  111.     building = { return self.doesnotapplyhere; }
  112.     gully = { return self.doesnotapplyhere; }
  113.     stream = { return self.doesnotapplyhere; }
  114.     rock = { return self.doesnotapplyhere; }
  115.     bed = { return self.doesnotapplyhere; }
  116.     crawl = { return self.doesnotapplyhere; }
  117.     cobble = { return self.doesnotapplyhere; }
  118.     tosurface = { return self.doesnotapplyhere; }
  119.     dark = { return self.doesnotapplyhere; }
  120.     passage = { return self.doesnotapplyhere; }
  121.     low = { return self.doesnotapplyhere; }
  122.     canyon = { return self.doesnotapplyhere; }
  123.     awkward = { return self.doesnotapplyhere; }
  124.     giant = { return self.doesnotapplyhere; }
  125.     view = { return self.doesnotapplyhere; }
  126.     pit = { return self.doesnotapplyhere; }
  127.     crack = { return self.doesnotapplyhere; }
  128.     steps = { return self.doesnotapplyhere; }
  129.     dome = { return self.doesnotapplyhere; }
  130.     hall = { return self.doesnotapplyhere; }
  131.     barren = { return self.doesnotapplyhere; }
  132.     debris = { return self.doesnotapplyhere; }
  133.     hole = { return self.doesnotapplyhere; }
  134.     wall = { return self.doesnotapplyhere; }
  135.     broken = { return self.doesnotapplyhere; }
  136.     floor = { return self.doesnotapplyhere; }
  137.     toroom = { return self.doesnotapplyhere; }
  138.     slit = { return self.doesnotapplyhere; }
  139.     slab = { return self.doesnotapplyhere; }
  140.     depression = { return self.doesnotapplyhere; }
  141.     entrance = { return self.doesnotapplyhere; }
  142.     secret = { return self.doesnotapplyhere; }
  143.     cave = { return self.doesnotapplyhere; }
  144.     bedquilt = { return self.doesnotapplyhere; }
  145.     oriental = { return self.doesnotapplyhere; }
  146.     cavern = { return self.doesnotapplyhere; }
  147.     shell = { return self.doesnotapplyhere; }
  148.     reservoir = { return self.doesnotapplyhere; }
  149.     main = { return self.doesnotapplyhere; }
  150.     office = { return self.doesnotapplyhere; }
  151.     fork = { return self.doesnotapplyhere; }
  152.  
  153.     nothinghappens = {
  154.         "Nothing happens.";
  155.         return nil;
  156.     }
  157.     doesnotapplyhere = {
  158.         "I don't know how to apply that word here.";
  159.         return nil;
  160.     }
  161.  
  162.     //
  163.     // Exits for NPC's.  Since NPC's won't take regular exits
  164.     // that are methods (instead of simple object names), we
  165.     // have to add "hints" in some rooms to allow complete access
  166.     // to all rooms.  By default, these are all nil.  (Note that
  167.     // it is important for them to be nil ojects, and not methods
  168.     // that return nil.  If they are methods, NPC's will try them.)
  169.     //
  170.     NPCexit1 = nil
  171.     NPCexit2 = nil
  172.     NPCexit3 = nil
  173.     NPCexit4 = nil
  174.     NPCexit5 = nil
  175.     NPCexit6 = nil
  176.     NPCexit7 = nil
  177.     NPCexit8 = nil
  178.  
  179.     //
  180.     // Each room has a list of exit properties that can be considered by
  181.     // NPC's.  The lists is determined at preinit time by looking
  182.     // at all the exit methods and discarding those that are methods.
  183.     // (The NPCexits are always considered, whether they are methods
  184.     // or not, since they're guranteed not to print anything or
  185.     // change game state when they're run.)
  186.     //
  187.     // Note: the list doesn't contain locations; it contains properties;
  188.     // i.e., it contains [ &west &up ... ], not [ At_Y2 ... ].
  189.     //
  190.     NPCexits = []
  191. ;
  192.  
  193. /*
  194.  * A class for the rooms in the "alike" maze.
  195.  */
  196. class CCR_alike_maze_room: CCR_room
  197.     sdesc = "Maze of Twisty Little Passages, All Alike"
  198.     ldesc = {
  199.         I(); "You are in a maze of twisty little passages, 
  200.         all alike.";
  201.     }
  202. ;
  203.  
  204. /*
  205.  * A class for rooms that are forbidden to non-player characters.
  206.  * (This means dwarves and pirate, not bear.)
  207.  *
  208.  * All pits inherit this class because the original source claims
  209.  * that dwarves won't follow the player into a pit, even though
  210.  * they do.  It makes more sense for them to give up the chase
  211.  * when the player scrambles down into a pit, and for that matter
  212.  * it may sound a bit funny for a combat to occur in a little pit,
  213.   * so I've add NoNPC too all the pit rooms.
  214.  */
  215. class NoNPC: CCR_room
  216.     noNPCs = true
  217. ;
  218.  
  219. /*
  220.  * A class for the dead ends.
  221.  */
  222. class CCR_dead_end_room: CCR_room
  223.     sdesc = "At a Dead End"
  224.     ldesc = {
  225.         I(); "You have reached a dead end.";
  226.     }
  227. ;
  228.  
  229. /*
  230.  * A class for areas that are naturally lit.
  231.  */
  232. class lightroom: CCR_room
  233.     islit = true
  234. ;
  235.  
  236. /*
  237.  * A class for rooms that are outside.
  238.  * These rooms are off limits once the cave is closed.
  239.  */
  240. class Outside: CCR_room
  241.     isoutside = true
  242. ;
  243.  
  244. /*
  245.  * A class for rooms that aren't far enough in to earn the player
  246.  * the bonus for getting "well in."
  247.  *
  248.  * See the definition of Me in ccr-std.t for info on how this is used.
  249.  */
  250. class NotFarIn: CCR_room, NoNPC
  251.     notfarin = true
  252. ;
  253.  
  254. class CCR_decoration: decoration;
  255.  
  256. /*
  257.  * This class lets us easily define a decoration that's in multiple
  258.  * places at once.  You just list the locations it appears in in
  259.  * a list called loclist.
  260.  *
  261.  * This is particularly nice for things like water, which can be
  262.  * manipulated -- we only have one object name to consider (Stream)
  263.  * for all the water in the game that can be taken.  (See ioPutIn
  264.  * for the bottle in ccr-item.t)
  265.  */
  266. class floatingdecoration: CCR_decoration
  267.     locationOK = true    // OK for location to be method
  268.     location = {
  269.         if (find(self.loclist, Me.location))
  270.             return Me.location;
  271.         else
  272.             return nil;
  273.     }
  274. ;
  275.  
  276. /*
  277.  * The locations
  278.  */
  279. At_End_Of_Road: CCR_room, lightroom, NotFarIn, Outside
  280.     sdesc = "At End Of Road"
  281.     ldesc = {
  282.         I(); "You are standing at the end of a road before a 
  283.         small brick building. Around you is a forest.  A 
  284.         small stream flows out of the building and down a 
  285.         gully.";
  286.     }
  287.     road = At_Hill_In_Road
  288.     west = At_Hill_In_Road
  289.     up = At_Hill_In_Road
  290.     building = Inside_Building
  291.     in = Inside_Building
  292.     east = Inside_Building
  293.     downstream = In_A_Valley
  294.     gully = In_A_Valley
  295.     stream = In_A_Valley
  296.     south = In_A_Valley
  297.     down = In_A_Valley
  298.     forest = In_Forest_1
  299.     north = In_Forest_1
  300.     depression = Outside_Grate
  301.  
  302.     // This was in the original fortran code, but conflicts
  303.     // with the fact that the building is to the east:
  304.     // east = In_Forest
  305. ;
  306. Building: floatingdecoration
  307.     sdesc = "building"
  308.     ldesc = {
  309.         if (Me.isIn(Inside_Building))
  310.             "You're in it.";
  311.         else
  312.             "It's a small brick building.  It seems to be 
  313.             a well house.";
  314.     }
  315.     noun = 'building' 'house' 'wellhouse'
  316.     adjective = 'well' 'small' 'brick'
  317.     loclist = [ At_End_Of_Road  At_Hill_In_Road  Inside_Building ]
  318.  
  319.     verDoEnter(actor) = {}
  320.     doEnter(actor) = {
  321.         actor.travelTo(At_End_Of_Road.in);
  322.     }
  323. ;
  324. Road: floatingdecoration
  325.     sdesc = "road"
  326.     noun = 'road' 'street' 'path'
  327.     adjective = 'dirt'
  328.     loclist = [ At_End_Of_Road  At_Hill_In_Road  In_Forest_2 ]
  329. ;
  330. Forest: floatingdecoration
  331.     sdesc = "forest"
  332.     adesc = "forest"
  333.     ldesc = {
  334.         "The trees of the forest are large hardwood oak and 
  335.         maple, with an occasional grove of pine or spruce.  
  336.         There is quite a bit of undergrowth, largely birch 
  337.         and ash saplings plus nondescript bushes of various 
  338.         sorts.  This time of year visibility is quite 
  339.         restricted by all the leaves, but travel is quite 
  340.         easy if you detour around the spruce and berry 
  341.         bushes.";
  342.     }
  343.  
  344.     noun = 'forest' 'tree' 'trees' 'oak' 'maple' 'grove' 'pine'
  345.         'spruce' 'birch' 'ash' 'saplings' 'bushes' 'leaves'
  346.         'berry' 'berries'
  347.     adjective = 'surrounding' 'open' 'hardwood' 'oak' 'maple' 'pine'
  348.         'spruce' 'birch' 'ash' 'berry'
  349.     loclist = [
  350.         At_End_Of_Road  At_Hill_In_Road  In_A_Valley
  351.         In_Forest_1  In_Forest_2
  352.     ]
  353. ;
  354. Stream: floatingdecoration
  355.     sdesc = "stream"
  356.     ldesc = {
  357.         if (Me.isIn(Inside_Building))
  358.             "The stream flows out through a pair of 1 
  359.             foot diameter sewer pipes.";
  360.         else
  361.             pass ldesc;
  362.     }
  363.     noun = 'stream' 'water' 'brook' 'river' 'lake'
  364.     adjective = 'small' 'tumbling' 'splashing' 'babbling' 'rushing'
  365.         'reservoir'
  366.     loclist = [
  367.         At_End_Of_Road  In_A_Valley  At_Slit_In_Streambed
  368.         In_Pit  In_Cavern_With_Waterfall  At_Reservoir
  369.     ]
  370.  
  371.     verDoDrink(actor) = {}
  372.     doDrink(actor) = {
  373.         "You have taken a drink from the stream.  The water 
  374.         tastes strongly of minerals, but is not unpleasant.  
  375.         It is extremely cold.";
  376.     }
  377.  
  378.     verDoTake(actor) = {
  379.         if (not bottle.isIn(Me))
  380.             "You have nothing in which to carry the water.";
  381.     }
  382.     doTake(actor) = {
  383.         bottle.ioPutIn(actor, self);
  384.     }
  385.     verDoPutIn(actor, io) = {}
  386.     doPutIn(actor, io) = {
  387.         if (io <> bottle)
  388.             "You have nothing in which to carry the water.";
  389.         else
  390.             bottle.ioPutIn(actor, self);
  391.     }
  392. ;
  393. Gully: floatingdecoration
  394.     sdesc = "gully"
  395.     noun = 'gully'
  396.     loclist = [ At_End_Of_Road  At_Slit_In_Streambed  Outside_Grate ]
  397. ;
  398.  
  399. At_Hill_In_Road: CCR_room, lightroom, NotFarIn, Outside
  400.     sdesc = "At Hill In Road"
  401.     ldesc = {
  402.         I(); "You have walked up a hill, still in the forest. 
  403.         The road slopes back down the other side of the 
  404.         hill.  There is a building in the distance.";
  405.     }
  406.     road = At_End_Of_Road
  407.     building = At_End_Of_Road
  408.     forwards = At_End_Of_Road
  409.     east = At_End_Of_Road
  410.     north = At_End_Of_Road
  411.     down = At_End_Of_Road
  412.     forest = In_Forest_1
  413.     south = In_Forest_1
  414.  
  415.     // Another bug in the original code:
  416.     // north = In_Forest
  417. ;
  418. Hill: CCR_decoration
  419.     sdesc = "hill"
  420.     ldesc = "It's just a typical hill."
  421.     noun = 'hill' 'bump' 'incline'
  422.     location = At_Hill_In_Road
  423. ;
  424. OtherSideOfHill: CCR_decoration
  425.     sdesc = "other side of hill"
  426.     thedesc = "the other side of the hill"
  427.     adesc = { self.thedesc; }
  428.     ldesc = "Why not explore it yourself?"
  429.     noun = 'side'
  430.     adjective = 'other'
  431.     location = At_Hill_In_Road
  432. ;
  433.  
  434. Inside_Building: CCR_room, lightroom, NotFarIn, Outside
  435.     sdesc = "Inside Building"
  436.     ldesc = {
  437.         I(); "You are inside a building, a well house for a 
  438.         large spring.";
  439.     }
  440.     out = At_End_Of_Road
  441.     outdoors = At_End_Of_Road
  442.     west = At_End_Of_Road
  443.     xyzzy = In_Debris_Room
  444.     plugh = At_Y2
  445.     downstream = { return self.stream; }
  446.     stream = {
  447.         "The stream flows out through a pair of 1 foot 
  448.         diameter sewer pipes. It would be advisable to use 
  449.         the exit.";
  450.  
  451.         return nil;
  452.     }
  453. ;
  454. Spring: CCR_decoration
  455.     sdesc = "spring"
  456.     location = Inside_Building
  457.     noun = 'spring'
  458.     adjective = 'large'
  459. ;
  460. SewerPipes: CCR_decoration
  461.     sdesc = "pair of 1 foot diameter sewer pipes"
  462.     location = Inside_Building
  463.     noun = 'pipes' 'pipe'
  464.     adjective = 'one' 'foot' '1-foot' 'diameter' 'sewer'
  465. ;
  466.  
  467. In_A_Valley: CCR_room, lightroom, NotFarIn, Outside
  468.     sdesc = "In A Valley"
  469.     ldesc = {
  470.         I(); "You are in a valley in the forest beside a 
  471.         stream tumbling along a rocky bed.";
  472.     }
  473.     upstream = At_End_Of_Road
  474.     building = At_End_Of_Road
  475.     north = At_End_Of_Road
  476.     forest = In_Forest_1
  477.     east = In_Forest_1
  478.     west = In_Forest_1
  479.     up = In_Forest_1
  480.     downstream = At_Slit_In_Streambed
  481.     south = At_Slit_In_Streambed
  482.     down = At_Slit_In_Streambed
  483.     depression = Outside_Grate
  484. ;
  485. Streambed: floatingdecoration
  486.     sdesc = "streambed"
  487.     noun = 'bed' 'streambed' 'rock'
  488.     adjective = 'stream' 'water' 'river' 'small' 'tumbling' 'splashing'
  489.             'babbling' 'rushing' 'rocky' 'bare' 'dry'
  490.     loclist = [ In_A_Valley  At_Slit_In_Streambed  Outside_Grate ]
  491. ;
  492. Valley: floatingdecoration
  493.     sdesc = "valley"
  494.     ldesc = {
  495.         if (Me.isIn(In_A_Valley))
  496.             "You're in it.";
  497.         else
  498.             pass ldesc;
  499.     }
  500.     noun = 'valley'
  501.     adjective = 'deep'
  502.     loclist = [ In_A_Valley  In_Forest_1  In_Forest_2 ]
  503. ;
  504.  
  505. In_Forest_1: CCR_room, lightroom, NotFarIn, Outside
  506.     sdesc = "In Forest"
  507.     ldesc = {
  508.         I(); "You are in open forest, with a deep valley to 
  509.         one side.";
  510.     }
  511.     valley = In_A_Valley
  512.     east = In_A_Valley
  513.     down = In_A_Valley
  514.  
  515.     // An approximation of the original code:
  516.     forest = {
  517.         if (rand(100) <= 50)
  518.             return In_Forest_1;
  519.         else
  520.             return In_Forest_2;
  521.     }
  522.  
  523.     forwards = In_Forest_1
  524.     north = In_Forest_1
  525.     west = In_Forest_1
  526.     south = In_Forest_1
  527. ;
  528.  
  529. In_Forest_2: CCR_room, lightroom, NotFarIn, Outside
  530.     sdesc = "In Forest"
  531.     ldesc = {
  532.         I(); "You are in open forest near both a valley and a 
  533.         road.";
  534.     }
  535.     road = At_End_Of_Road
  536.     north = At_End_Of_Road
  537.     valley = In_A_Valley
  538.     east = In_A_Valley
  539.     west = In_A_Valley
  540.     down = In_A_Valley
  541.     forest = In_Forest_1
  542.     south = In_Forest_1
  543. ;
  544.  
  545. At_Slit_In_Streambed: CCR_room, lightroom, NotFarIn, Outside
  546.     sdesc = "At Slit In Streambed"
  547.     ldesc = {
  548.         I(); "At your feet all the water of the stream 
  549.         splashes into a 2-inch slit in the rock.  Downstream 
  550.         the streambed is bare rock.";
  551.     }
  552.     building = At_End_Of_Road
  553.     upstream = In_A_Valley
  554.     north = In_A_Valley
  555.     forest = In_Forest_1
  556.     east = In_Forest_1
  557.     west = In_Forest_1
  558.     downstream = Outside_Grate
  559.     rock = Outside_Grate
  560.     bed = Outside_Grate
  561.     south = Outside_Grate
  562.  
  563.     slit = { return self.down; }
  564.     stream = { return self.down; }
  565.     down = {
  566.         "You don't fit through a two-inch slit!";
  567.         return nil;
  568.     }
  569. ;
  570. Slit: CCR_decoration
  571.     sdesc = "2-inch slit"
  572.     ldesc = "It's just a 2-inch slit in the rock, through which the
  573.         stream is flowing."
  574.     location = At_Slit_In_Streambed
  575.     noun = 'slit'
  576.     adjective = 'two' 'inch' '2-inch' 'two-inch'
  577. ;
  578.  
  579. Outside_Grate: CCR_room, lightroom, NotFarIn, Outside
  580.     sdesc = "Outside Grate"
  581.     ldesc = {
  582.         I(); "You are in a 20-foot depression floored with 
  583.         bare dirt.  Set into the dirt is a strong steel grate 
  584.         mounted in concrete.  A dry streambed leads into the 
  585.         depression.";
  586.     }
  587.     forest = In_Forest_1
  588.     east = In_Forest_1
  589.     west = In_Forest_1
  590.     south = In_Forest_1
  591.     building = At_End_Of_Road
  592.     upstream = At_Slit_In_Streambed
  593.     gully = At_Slit_In_Streambed
  594.     north = At_Slit_In_Streambed
  595.     
  596.     in = { return self.down; }
  597.     down = {
  598.         Grate.doEnter(Me);
  599.         return nil;
  600.     }
  601. ;
  602. Depression: CCR_decoration
  603.     sdesc = "20-foot depression"
  604.     ldesc = "You're standing in it."
  605.     location = Outside_Grate
  606.     noun = 'depression' 'dirt'
  607.     adjective = '20-foot' 'twenty' 'foot' 'twenty-foot' 'bare'
  608. ;
  609. Grate: fixeditem, keyedLockable
  610.     isopen = nil
  611.     islocked = true
  612.     sdesc = "steel grate"
  613.     ldesc = {
  614.         if (self.isIn(Outside_Grate)) {
  615.             "It just looks like an ordinary grate
  616.             mounted in concrete.";
  617.         }
  618.         else {
  619.             "It's just a 3x3 steel grate mounted
  620.             in the ceiling.";
  621.         }
  622.  
  623.         " It is ";
  624.         if (self.isopen)
  625.             "open.";
  626.         else if (self.islocked) 
  627.             "closed and locked.";
  628.         else 
  629.             "closed.";
  630.     }
  631.     noun = 'grate' 'lock' 'gate' 'grille'
  632.     adjective = 'metal' 'strong' 'steel' 'open' 'closed' 'locked'
  633.         'unlocked'
  634.  
  635.     locationOK = true // Tell compiler OK for location to be method
  636.     location = {
  637.         if (Me.isIn(Outside_Grate))
  638.             return Outside_Grate;
  639.         else        
  640.             return Below_The_Grate;
  641.     }
  642.     mykey = set_of_keys
  643.  
  644.     verDoEnter(actor) = {}
  645.     doEnter(actor) = {
  646.         if (not Grate.islocked) {
  647.             if (not Grate.isopen) {
  648.                 "(Opening the grate first.)\b";
  649.                 Grate.isopen := true;
  650.                         
  651.             }
  652.             if (actor.isIn(Outside_Grate))
  653.                 actor.travelTo(Below_The_Grate);
  654.             else
  655.                 actor.travelTo(Outside_Grate);
  656.         }
  657.         else {
  658.             "You can't go through a locked steel grate!";
  659.         }
  660.     }
  661.     
  662.     verIoPutIn(actor) = { "You can't put anything in that! "; }
  663.     verDoPick = { "You have no tools to pick the lock with."; }
  664. ;
  665.  
  666. Below_The_Grate: CCR_room, lightroom, NotFarIn
  667.     sdesc = "Below the Grate"
  668.     ldesc = {
  669.         I(); "You are in a small chamber beneath a 3x3 steel 
  670.         grate to the surface. A low crawl over cobbles leads 
  671.         inward to the west.";
  672.     }
  673.     crawl = In_Cobble_Crawl
  674.     cobble = In_Cobble_Crawl
  675.     in = In_Cobble_Crawl
  676.     west = In_Cobble_Crawl
  677.     pit = At_Top_Of_Small_Pit
  678.     debris = In_Debris_Room
  679.  
  680.     outdoors = { return self.up; }    // DMB: added
  681.     out = { return self.up; }
  682.     up = {
  683.         Grate.doEnter(Me);
  684.         return nil;
  685.     }
  686. ;
  687. Cobbles: floatingdecoration
  688.     sdesc = "cobbles"
  689.     adesc = "cobbles"
  690.     ldesc = "They're just ordinary cobbles."
  691.     noun = 'cobble' 'cobbles' 'cobblestones' 'cobblestone' 'stones'
  692.         'stone'
  693.     adjective = 'cobble'
  694.     loclist = [ Below_The_Grate  In_Cobble_Crawl  In_Debris_Room ]
  695. ;
  696.  
  697. In_Cobble_Crawl: CCR_room, lightroom, NotFarIn
  698.     sdesc = "In Cobble Crawl"
  699.     ldesc = {
  700.         I(); "You are crawling over cobbles in a low passage. 
  701.         There is a dim light at the east end of the 
  702.         passage.";
  703.     }
  704.     out = Below_The_Grate
  705.     tosurface = Below_The_Grate
  706.     east = Below_The_Grate
  707.     in = In_Debris_Room
  708.     dark = In_Debris_Room
  709.     west = In_Debris_Room
  710.     debris = In_Debris_Room
  711.     pit = At_Top_Of_Small_Pit
  712.  
  713.     // DMB: added the following, in accordance with its presence
  714.     // in In_Debris_Room and rooms beyond.
  715.     depression = {
  716.         Grate.doEnter(Me);
  717.  
  718.         // If the player didn't move, the grate must be
  719.         // locked.  Move the player underneath the grate.
  720.         if (Me.isIn(self)) {
  721.             "\b";
  722.             Me.travelTo(Below_The_Grate);
  723.         }
  724.         // We've already moved the player, but we have to
  725.         // return a value, so just return nil (which results
  726.         // in no more movement).
  727.         return nil;
  728.     }
  729. ;
  730.  
  731. In_Debris_Room: CCR_room, NotFarIn
  732.     sdesc = "In Debris Room"
  733.     ldesc = {
  734.         I(); "You are in a debris room filled with stuff 
  735.         washed in from the surface. A low wide passage with 
  736.         cobbles becomes plugged with mud and debris here, but 
  737.         an awkward canyon leads upward and west."; P();
  738.  
  739.         I(); "A note on the wall says, \"Magic word XYZZY.\"";
  740.     }
  741.     entrance = Below_The_Grate
  742.     crawl = In_Cobble_Crawl
  743.     cobble = In_Cobble_Crawl
  744.     passage = In_Cobble_Crawl
  745.     low = In_Cobble_Crawl
  746.     east = In_Cobble_Crawl
  747.     canyon = In_Awkward_Sloping_E_W_Canyon
  748.     in = In_Awkward_Sloping_E_W_Canyon
  749.     up = In_Awkward_Sloping_E_W_Canyon
  750.     west = In_Awkward_Sloping_E_W_Canyon
  751.     xyzzy = Inside_Building
  752.     pit = At_Top_Of_Small_Pit
  753.  
  754.     // The original occasionally allowed the player to teleport
  755.     // large distances in one turn.  This is just one example.
  756.     depression = {
  757.         Grate.doEnter(Me);
  758.  
  759.         // If the player didn't move, the grate must be
  760.         // locked.  Move the player underneath the grate.
  761.         if (Me.isIn(self)) {
  762.             "\b";
  763.             Me.travelTo(Below_The_Grate);
  764.         }
  765.  
  766.         // We've already moved the player, but we have to
  767.         // return a value, so just return nil (which results
  768.         // in no more movement).
  769.         return nil;
  770.     }
  771. ;
  772. Debris: floatingdecoration
  773.     sdesc = "debris"
  774.     ldesc = "Yuck."
  775.     noun = 'debris' 'stuff' 'mud'
  776.     loclist = [ In_Debris_Room  In_Arched_Hall ]
  777. ;
  778. XyzzyNote: CCR_decoration, readable
  779.     sdesc = "note"
  780.     ldesc = { self.readdesc; }
  781.     readdesc = "The note says \"Magic word XYZZY\"."
  782.     noun = 'note'
  783.     location = In_Debris_Room
  784. ;
  785.  
  786. In_Awkward_Sloping_E_W_Canyon: CCR_room, NotFarIn
  787.     sdesc = "In Awkward Sloping E/W Canyon"
  788.     ldesc = {
  789.         I(); "You are in an awkward sloping east/west 
  790.         canyon.";
  791.     }
  792.  
  793.     entrance = Below_The_Grate
  794.     down = In_Debris_Room
  795.     east = In_Debris_Room
  796.     debris = In_Debris_Room
  797.     in = In_Bird_Chamber
  798.     up = In_Bird_Chamber
  799.     west = In_Bird_Chamber
  800.     pit = At_Top_Of_Small_Pit
  801.  
  802.     depression = {
  803.         Grate.doEnter(Me);
  804.  
  805.         // If the player didn't move, the grate must be
  806.         // locked.  Move the player underneath the grate.
  807.         if (Me.isIn(self)) {
  808.             "\b";
  809.             Me.travelTo(Below_The_Grate);
  810.         }
  811.         
  812.         // We've already moved the player, but we have to
  813.         // return a value, so just return nil (which results
  814.         // in no more movement).
  815.         return nil;
  816.     }
  817. ;
  818.  
  819. In_Bird_Chamber: CCR_room, NotFarIn
  820.     sdesc = "In Bird Chamber"
  821.     ldesc = {
  822.         I(); "You are in a splendid chamber thirty feet high. 
  823.         The walls are frozen rivers of orange stone.  An 
  824.         awkward canyon and a good passage exit from east and 
  825.         west sides of the chamber.";
  826.     }
  827.  
  828.     entrance = Below_The_Grate
  829.     debris = In_Debris_Room
  830.     canyon = In_Awkward_Sloping_E_W_Canyon
  831.     east = In_Awkward_Sloping_E_W_Canyon
  832.     passage = At_Top_Of_Small_Pit
  833.     pit = At_Top_Of_Small_Pit
  834.     west = At_Top_Of_Small_Pit
  835.  
  836.     depression = {
  837.         Grate.doEnter(Me);
  838.  
  839.         // If the player didn't move, the grate must be
  840.         // locked.  Move the player underneath the grate.
  841.         if (Me.isIn(self)) {
  842.             "\b";
  843.             Me.travelTo(Below_The_Grate);
  844.         }
  845.  
  846.         // We've already moved the player, but we have to
  847.         // return a value, so just return nil (which results
  848.         // in no more movement).
  849.         return nil;
  850.     }
  851. ;
  852.  
  853. At_Top_Of_Small_Pit: CCR_room, NotFarIn
  854.     sdesc = "At Top of Small Pit"
  855.     ldesc = {
  856.         // Note: this used to say "An east passage ends here..."
  857.         // but that's obviously a mistake.
  858.  
  859.         I(); "At your feet is a small pit breathing traces of 
  860.         white mist.  A west passage ends here except for a 
  861.         small crack leading on."; P();
  862.  
  863.         I(); "Rough stone steps lead down the pit.";
  864.     }
  865.     entrance = Below_The_Grate
  866.     debris = In_Debris_Room
  867.     passage = In_Bird_Chamber
  868.     east = In_Bird_Chamber
  869.     crack = { return self.west; }
  870.     west = {
  871.         "The crack is far too small for you to follow.";
  872.         return nil;
  873.     }
  874.  
  875.     down = {
  876.         if (large_gold_nugget.isIn(Me))
  877.             return broken_neck.death;
  878.         else
  879.             return In_Hall_Of_Mists;
  880.     }
  881.  
  882.     depression = {
  883.         Grate.doEnter(Me);
  884.  
  885.         // If the player didn't move, the grate must be
  886.         // locked.  Move the player underneath the grate.
  887.         if (Me.isIn(self)) {
  888.             "\b";
  889.             Me.travelTo(Below_The_Grate);
  890.         }
  891.         
  892.         // We've already moved the player, but we have to
  893.         // return a value, so just return nil (which results
  894.         // in no more movement).
  895.         return nil;
  896.     }
  897. SmallPit: CCR_decoration
  898.     sdesc = "small pit"
  899.     ldesc = "The pit is breathing traces of white mist."
  900.     location = At_Top_Of_Small_Pit
  901.     noun = 'pit'
  902. ;
  903. PitCrack: CCR_decoration
  904.     sdesc = "crack"
  905.     ldesc = "The crack is very small -- far too small for you to follow."
  906.     location = At_Top_Of_Small_Pit
  907.     noun = 'crack'
  908.     adjective = 'small'
  909. ;
  910. Mist: floatingdecoration
  911.     sdesc = "mist"
  912.     ldesc = {
  913.         "Mist is a white vapor, usually water, seen from time 
  914.         to time in caverns.  It can be found anywhere but is 
  915.         frequently a sign of a deep pit leading down to 
  916.         water.";
  917.     }
  918.     noun = 'mist' 'vapor' 'wisps'
  919.     adjective = 'white' 'water'
  920.     loclist = [
  921.         At_Top_Of_Small_Pit In_Hall_Of_Mists
  922.         On_East_Bank_Of_Fissure  At_Window_On_Pit_1
  923.         At_West_End_Of_Hall_Of_Mists In_Misty_Cavern
  924.         In_Mirror_Canyon  At_Reservoir At_Window_On_Pit_2
  925.         On_Sw_Side_Of_Chasm
  926.     ]
  927. ;
  928.  
  929. In_Hall_Of_Mists: CCR_room
  930.     sdesc = "In Hall of Mists"
  931.     ldesc = {
  932.         I(); "You are at one end of a vast hall stretching 
  933.         forward out of sight to the west.  There are openings 
  934.         to either side.  Nearby, a wide stone staircase leads 
  935.         downward.  The hall is filled with wisps of white 
  936.         mist swaying to and fro almost as if alive.  A cold 
  937.         wind blows up the staircase.  There is a passage at 
  938.         the top of a dome behind you."; P();
  939.  
  940.         I(); "Rough stone steps lead up the dome.";
  941.     }
  942.     left = In_Nugget_Of_Gold_Room
  943.     south = In_Nugget_Of_Gold_Room
  944.     forwards = On_East_Bank_Of_Fissure
  945.     hall = On_East_Bank_Of_Fissure
  946.     west = On_East_Bank_Of_Fissure
  947.     stairs = In_Hall_Of_Mt_King
  948.     down = In_Hall_Of_Mt_King
  949.     north = In_Hall_Of_Mt_King
  950.     y2 = Jumble_Of_Rock
  951.  
  952.     up = {
  953.         if (large_gold_nugget.isIn(Me)) {
  954.             "The dome is unclimbable.";
  955.             return nil;
  956.         }
  957.         else {
  958.             return At_Top_Of_Small_Pit;
  959.         }
  960.     }
  961. ;
  962. Staircase: CCR_decoration
  963.     sdesc = "wide stone staircase"
  964.     ldesc = "The staircase leads down."
  965.     location = In_Hall_Of_Mists
  966.     noun = 'stair' 'stairs' 'staircase'
  967.     adjective = 'wide' 'stone'
  968. ;
  969. DomeSteps: CCR_decoration
  970.     sdesc = "rough stone steps"
  971.     ldesc = "The rough stone steps lead up the dome."
  972.     location = In_Hall_Of_Mists
  973.     noun = 'stair' 'stairs' 'staircase'
  974.     adjective = 'rough' 'stone'
  975. ;
  976. Dome: CCR_decoration
  977.     sdesc = "dome"
  978.     ldesc = {
  979.         if (large_gold_nugget.isIn(Me))
  980.             "I'm not sure you'll be able to get up it
  981.             with what you're carrying.";
  982.         else
  983.             "It looks like you might be able to climb up it.";
  984.     }
  985.     location = In_Hall_Of_Mists
  986.     noun = 'dome'
  987.  
  988.     verDoClimb(actor) = {}
  989.     doClimb(actor) = {
  990.         actor.travelTo(In_Hall_Of_Mists.up);
  991.     }
  992. ;
  993.  
  994. On_East_Bank_Of_Fissure: CCR_room
  995.     sdesc = "On East Bank of Fissure"
  996.     ldesc = {
  997.         I(); "You are on the east bank of a fissure slicing 
  998.         clear across the hall. The mist is quite thick here, 
  999.         and the fissure is too wide to jump.";
  1000.  
  1001.          if (CrystalBridge.exists) {
  1002.             P(); I();
  1003.             "A crystal bridge now spans the fissure.";
  1004.         }
  1005.     }
  1006.     hall = In_Hall_Of_Mists
  1007.     east = In_Hall_Of_Mists
  1008.  
  1009.     forwards = { return self.jump; }
  1010.     jump = {
  1011.         if (CrystalBridge.exists) {
  1012.             "I respectfully suggest you go across the 
  1013.             bridge instead of jumping.";
  1014.  
  1015.             return nil;
  1016.         }
  1017.         else
  1018.             return didnt_make_it.death;
  1019.     }
  1020.  
  1021.     over = { return self.across; }
  1022.     west = { return self.across; }
  1023.     cross = { return self.across; }
  1024.     across = {
  1025.         CrystalBridge.doCross(Me);
  1026.         return nil;
  1027.     }
  1028.  
  1029.     //
  1030.     // NPC's can go across too, but only if the bridge exists.
  1031.     //
  1032.     NPCexit1 = {
  1033.         if (CrystalBridge.exists)
  1034.             return West_Side_Of_Fissure;
  1035.         else
  1036.             return nil;
  1037.     }
  1038. ;
  1039. BridgeFissure: floatingdecoration
  1040.     sdesc = "fissure"
  1041.     ldesc = {
  1042.         if (CrystalBridge.exists)
  1043.             "A crystal bridge now spans the fissure.";
  1044.         else
  1045.             "The fissure looks far too wide to jump.";
  1046.     }
  1047.     noun = 'fissure'
  1048.     adjective = 'wide'
  1049.     loclist = [ West_Side_Of_Fissure  On_East_Bank_Of_Fissure ]
  1050. ;
  1051. CrystalBridge: CCR_decoration
  1052.     exists = nil
  1053.     sdesc = "Crystal bridge"
  1054.     ldesc = "It spans the fissure, thereby providing you a way across."
  1055.     locationOK = true    // tell compiler OK for location to be method
  1056.     location = {
  1057.         if (self.exists) {
  1058.             if (Me.isIn(West_Side_Of_Fissure))
  1059.                 return West_Side_Of_Fissure;
  1060.             else
  1061.                 return On_East_Bank_Of_Fissure;
  1062.         }
  1063.         else
  1064.             return nil;
  1065.     }
  1066.     noun = 'bridge'
  1067.     adjective = 'crystal' 'magic' 'rod'
  1068.  
  1069.     verDoCross(actor) = {}
  1070.     doCross(actor) = {
  1071.         if (self.exists) {
  1072.             if (actor.isIn(On_East_Bank_Of_Fissure))
  1073.                 actor.travelTo(West_Side_Of_Fissure);
  1074.             else
  1075.                 actor.travelTo(On_East_Bank_Of_Fissure);
  1076.         }
  1077.         else
  1078.             "There is no way across the fissure.";
  1079.     }
  1080. ;
  1081.  
  1082. In_Nugget_Of_Gold_Room: CCR_room
  1083.     sdesc = "In Nugget of Gold Room"
  1084.     ldesc = {
  1085.         I(); "This is a low room with a crude note on the 
  1086.         wall. "; NuggetNote.readdesc;
  1087.     }
  1088.     hall = In_Hall_Of_Mists
  1089.     out = In_Hall_Of_Mists
  1090.     north = In_Hall_Of_Mists
  1091. ;
  1092. NuggetNote: CCR_decoration, readable
  1093.     sdesc = "note"
  1094.     ldesc = { self.readdesc; }
  1095.     readdesc = {
  1096.         "The note says, \"You won't get it up the steps\".";
  1097.     }
  1098.     location = In_Nugget_Of_Gold_Room
  1099.     noun = 'note'
  1100.     adjective = 'crude'
  1101. ;
  1102.  
  1103. In_Hall_Of_Mt_King: CCR_room
  1104.     sdesc = "In Hall of Mt King"
  1105.     ldesc = {
  1106.         I(); "You are in the hall of the mountain king, with 
  1107.         passages off in all directions.";
  1108.  
  1109.         if (Snake.isIn(self)) {
  1110.             P();
  1111.             I(); "A huge green fierce snake bars the way!";
  1112.         }
  1113.     }
  1114.     stairs = In_Hall_Of_Mists
  1115.     up = In_Hall_Of_Mists
  1116.     east = In_Hall_Of_Mists
  1117.  
  1118.     left = { return self.north; }
  1119.     north = {
  1120.         if (self.snakecheck)
  1121.             return Low_N_S_Passage;
  1122.         else
  1123.             return nil;
  1124.     }
  1125.     
  1126.     right = { return self.south; }
  1127.     south = {
  1128.         if (self.snakecheck)
  1129.             return In_South_Side_Chamber;
  1130.         else
  1131.             return nil;
  1132.     }
  1133.  
  1134.     forwards = { return self.west; }
  1135.     west = {
  1136.         if (self.snakecheck)
  1137.             return In_West_Side_Chamber;
  1138.         else
  1139.             return nil;
  1140.     }
  1141.  
  1142.     /*
  1143.      * An interesting little bit of trivia here:
  1144.      * 35% of the time you can slip past the snake and into
  1145.      * the secret canyon.  (This is in the original fortran
  1146.      * code.)  But if you say "secret" you will *always* sneak
  1147.      * by it.
  1148.      */
  1149.     sw = {
  1150.         if (rand(100) <= 35) {
  1151.             return In_Secret_E_W_Canyon;
  1152.         }
  1153.         else {
  1154.             if (self.snakecheck)
  1155.                 return In_Secret_E_W_Canyon;
  1156.             else
  1157.                 return nil;
  1158.         }
  1159.     }
  1160.     secret = In_Secret_E_W_Canyon
  1161.  
  1162.     snakecheck = {
  1163.         if (Snake.isIn(Me.location)) {
  1164.             "You can't get by the snake.";
  1165.             return nil;
  1166.         }
  1167.         else
  1168.             return true;
  1169.     }
  1170. ;
  1171. Snake: CCR_decoration
  1172.     sdesc = "snake"
  1173.     ldesc = "I wouldn't mess with it if I were you."
  1174.     location = In_Hall_Of_Mt_King
  1175.     noun = 'snake' 'cobra' 'asp'
  1176.     adjective = 'huge' 'fierce' 'green' 'ferocious' 'venemous'
  1177.         'venomous' 'large' 'big' 'killer'
  1178.  
  1179.     verDoFeed(actor) = {}
  1180.     doFeed(actor) = {
  1181.         if (little_bird.isIn(Me)) {
  1182.             "The snake has now devoured your bird.";
  1183.             little_bird.moveInto(nil);
  1184.         }
  1185.         else if (little_bird.isIn(self.location))
  1186.             "You have nothing to feed it.";
  1187.         else
  1188.             "There's nothing here it wants to eat (except 
  1189.             perhaps you).";
  1190.     }
  1191.     verIoGiveTo(actor) = {}
  1192.     doGiveTo(actor, dobj) = {
  1193.         if (dobj = little_bird)
  1194.             self.doFeed(actor);
  1195.         else {
  1196.             "The snake does not seem interested in ";
  1197.             dobj.thedesc; ".";
  1198.         }
  1199.     }
  1200.     
  1201.     verDoAttack(actor) = {}
  1202.     doAttack(actor) = {
  1203.         "Attacking the snake both doesn't work and is very 
  1204.         dangerous.";
  1205.     }
  1206.     verDoAttackWith(actor, io) = { self.verDoAttack(actor); }
  1207.     doAttackWith(actor, io) = { self.doAttack(actor); }
  1208.  
  1209.     verIoThrowAt(actor) = { self.verIoGiveTo(actor); }
  1210.     ioThrowAt(actor, dobj) = {
  1211.         if (dobj = axe)
  1212.             self.doAttackWith(actor, dobj);
  1213.         else
  1214.             self.ioGiveTo(actor, dobj);
  1215.     }
  1216.     verIoThrowTo(actor) = { self.verIoGiveTo(actor); }
  1217.     ioThrowTo(actor, dobj) = {
  1218.         if (dobj = axe)
  1219.             self.doAttackWith(actor, dobj);
  1220.         else
  1221.             self.ioGiveTo(actor, dobj);
  1222.     }
  1223.     
  1224.     verDoKick(actor) = {}
  1225.     doKick(actor) = { "That would be satisfying, but totally insane."; }
  1226.  
  1227.     verifyRemove(actor) = { "Surely you're joking."; }
  1228. ;
  1229.  
  1230. At_West_End_Of_Twopit_Room: CCR_room
  1231.     sdesc = "At West End of Twopit Room"
  1232.     ldesc = {
  1233.         I(); "You are at the west end of the twopit room.  
  1234.          There is a large hole in the wall above the pit at 
  1235.         this end of the room.";
  1236.  
  1237.         if (PlantStickingUp.isIn(self)) {
  1238.             P(); I(); PlantStickingUp.ldesc;
  1239.         }
  1240.     }
  1241.     east = At_East_End_Of_Twopit_Room
  1242.     across = At_East_End_Of_Twopit_Room
  1243.     west = In_Slab_Room
  1244.     slab = In_Slab_Room
  1245.     down = In_West_Pit
  1246.     pit = In_West_Pit
  1247.  
  1248.     up = { return self.hole; }    // DMB: added
  1249.     hole = {
  1250.         "It is too far up for you to reach.";
  1251.         return nil;
  1252.     }
  1253. ;
  1254. HoleAbovePit_1: CCR_decoration
  1255.     sdesc = "hole above pit"
  1256.     ldesc = {
  1257.         "The hole is in the wall above the pit at 
  1258.         this end of the room.";
  1259.     }
  1260.     noun = 'hole'
  1261.     adjective = 'large'
  1262.     location = At_West_End_Of_Twopit_Room
  1263.  
  1264.     verDoEnter(actor) = { "It is too far up for you to reach."; }
  1265. ;
  1266. PlantStickingUp: CCR_decoration
  1267.     sdesc = {
  1268.         if (Plant.size = 1)
  1269.             "top of 12-foot-tall beanstalk";
  1270.         else
  1271.             "huge beanstalk";
  1272.     }
  1273.     ldesc = {
  1274.         if (Plant.size = 1)
  1275.             "The top of a 12-foot-tall beanstalk is 
  1276.             poking out of the west pit.";
  1277.         else
  1278.             "There is a huge beanstalk growing out of the 
  1279.             west pit up to the hole.";
  1280.     }
  1281.     noun = 'plant' 'beanstalk' 'stalk'
  1282.     adjective = 'bean' 'giant' 'tiny' 'little' 'murmuring'
  1283.         '12-foot-tall' 'twelve' 'foot' 'tall' 'bellowing'
  1284.  
  1285.     location = {
  1286.         if (Plant.size = 0)
  1287.             return nil;
  1288.         else if (Me.isIn(At_West_End_Of_Twopit_Room))
  1289.             return At_West_End_Of_Twopit_Room;
  1290.         else
  1291.             return At_East_End_Of_Twopit_Room;        
  1292.     }
  1293. ;
  1294.  
  1295. In_East_Pit: CCR_room, NoNPC
  1296.     sdesc = "In East Pit"
  1297.     ldesc = {
  1298.         I(); "You are at the bottom of the eastern pit in the 
  1299.         twopit room.  There is a small pool of oil in one 
  1300.         corner of the pit.";
  1301.     }
  1302.     up = At_East_End_Of_Twopit_Room
  1303.     out = At_East_End_Of_Twopit_Room
  1304. ;
  1305. EastPit: CCR_decoration
  1306.     sdesc = "eastern pit"
  1307.     ldesc = "You're in it."
  1308.     noun = 'pit' 'corner'
  1309.     adjective = 'east' 'eastern'
  1310.     location = In_East_Pit
  1311. ;
  1312. Oil: CCR_decoration
  1313.     sdesc = "pool of oil"
  1314.     noun = 'pool' 'oil'
  1315.     adjective = 'small'
  1316.     location = In_East_Pit
  1317.  
  1318.     verDoTake(actor) = {
  1319.         if (not bottle.isIn(Me))
  1320.             "You have nothing in which to carry the oil.";
  1321.     }
  1322.     doTake(actor) = {
  1323.         bottle.ioPutIn(actor, self);
  1324.     }
  1325.     verDoPutIn(actor, io) = {}
  1326.     doPutIn(actor, io) = {
  1327.         if (io <> bottle)
  1328.             "You have nothing in which to carry the oil.";
  1329.         else
  1330.             bottle.ioPutIn(actor, self);
  1331.     }
  1332. ;
  1333.  
  1334. In_West_Pit: CCR_room, NoNPC
  1335.     sdesc = "In West Pit"
  1336.     ldesc = {
  1337.         I(); "You are at the bottom of the western pit in the 
  1338.         twopit room.  There is a large hole in the wall about 
  1339.         25 feet above you."; P();
  1340.  
  1341.         I(); Plant.ldesc;
  1342.     }
  1343.     up = At_West_End_Of_Twopit_Room
  1344.     out = At_West_End_Of_Twopit_Room
  1345.     climb = {
  1346.         if (Plant.size < 1 or Plant.size > 2) {
  1347.             "There is nothing here to climb.  Use \"up\" 
  1348.             or \"out\" to leave the pit.";
  1349.  
  1350.             return nil;
  1351.         }
  1352.         else {
  1353.             Plant.doClimb(Me);
  1354.             return nil;
  1355.         }
  1356.     }
  1357. ;
  1358. Plant: CCR_decoration
  1359.     size = 0
  1360.  
  1361.     sdesc = {
  1362.         if (self.size = 0)
  1363.             "plant";
  1364.         else if (self.size = 1)
  1365.             "beanstalk";
  1366.         else if (self.size = 2)
  1367.             "giant beanstalk";
  1368.     }
  1369.     ldesc = {
  1370.         if (self.size = 0)
  1371.             "There is a tiny little plant in the pit, 
  1372.             murmuring \"Water, water, ...\"";
  1373.         else if (self.size = 1)
  1374.             "There is a 12-foot-tall beanstalk stretching 
  1375.             up out of the pit, bellowing \"Water!! 
  1376.             Water!!\"";
  1377.         else if (self.size = 2)
  1378.             "There is a gigantic beanstalk stretching all 
  1379.             the way up to the hole.";
  1380.     }
  1381.     location = In_West_Pit
  1382.     noun = 'plant' 'beanstalk' 'stalk'
  1383.     adjective = 'bean' 'giant' 'tiny' 'little' 'murmuring'
  1384.         '12-foot-tall' 'twelve' 'foot' 'tall' 'bellowing'
  1385.  
  1386.     verDoClimb(actor) = {
  1387.         if (self.size = 0)
  1388.             "It's just a little plant!";
  1389.     }
  1390.     doClimb(actor) = {
  1391.         if (self.size = 1) {
  1392.             "You have climbed up the plant and out of the 
  1393.             pit.\b";
  1394.  
  1395.             Me.travelTo(At_West_End_Of_Twopit_Room);
  1396.         }
  1397.         else {
  1398.             "You clamber up the plant and scurry through 
  1399.             the hole at the top.\b";
  1400.  
  1401.             Me.travelTo(In_Narrow_Corridor);
  1402.         }
  1403.     }
  1404.  
  1405.     verDoWater(actor) = {}
  1406.     doWater(actor) = {
  1407.         if (bottle.isIn(Me))
  1408.             bottle.doPourOn(actor, self);
  1409.         else
  1410.             "You have nothing to water the plant with.";
  1411.     }
  1412.     verDoOil(actor) = {}
  1413.     doOil(actor) = { self.doWater(actor); }
  1414.  
  1415.     // The plant's not going anywhere.
  1416.     verifyRemove(actor) = {
  1417.         "The plant has exceptionally deep roots and cannot be 
  1418.         pulled free.";
  1419.     }
  1420.  
  1421.     water = {
  1422.         self.size := self.size + 1;
  1423.  
  1424.         if (self.size = 1)
  1425.             "The plant spurts into furious growth for a 
  1426.             few seconds.";
  1427.         else if (self.size = 2)
  1428.             "The plant grows explosively, almost filling 
  1429.             the bottom of the pit.";
  1430.         else {
  1431.             "You've over-watered the plant!  It's 
  1432.             shriveling up!  It's, it's...";
  1433.  
  1434.             self.size := 0;
  1435.         }
  1436.     }
  1437. ;
  1438. WestPit: CCR_decoration
  1439.     sdesc = "western pit"
  1440.     ldesc = "You're in it."
  1441.     noun = 'pit' 'corner'
  1442.     adjective = 'west' 'western'
  1443.     location = In_West_Pit
  1444. ;
  1445. HoleAbovePit_2: CCR_decoration
  1446.     sdesc = "hole above pit"
  1447.     ldesc = "The hole is in the wall above you."
  1448.     noun = 'hole'
  1449.     adjective = 'large'
  1450.     location = At_West_End_Of_Twopit_Room
  1451.  
  1452.     verDoEnter(actor) = {
  1453.         "You're not anywhere near the pit -- it's far overhead.";
  1454.     }
  1455. ;
  1456.  
  1457. West_Side_Of_Fissure: CCR_room
  1458.     sdesc = "West Side of Fissure"
  1459.     ldesc = {
  1460.         I(); "You are on the west side of the fissure in the 
  1461.         hall of mists.";
  1462.  
  1463.         if (CrystalBridge.exists) {
  1464.             P(); I();
  1465.             "A crystal bridge now spans the fissure.";
  1466.         }
  1467.     }
  1468.  
  1469.     west = At_West_End_Of_Hall_Of_Mists
  1470.  
  1471.     forwards = { return self.jump; }
  1472.     jump = {
  1473.         if (CrystalBridge.exists) {
  1474.             "I respectfully suggest you go across the 
  1475.             bridge instead of jumping.";
  1476.  
  1477.             return nil;
  1478.         }
  1479.         else
  1480.             return didnt_make_it.death;
  1481.     }
  1482.  
  1483.     over = { return self.across; }
  1484.     east = { return self.across; }
  1485.     cross = { return self.across; }
  1486.     across = {
  1487.         CrystalBridge.doCross(Me);
  1488.         return nil;
  1489.     }
  1490.  
  1491.     north = {
  1492.         "You have crawled through a very low wide passage 
  1493.         parallel to and north of the hall of mists.\b";
  1494.  
  1495.         return At_West_End_Of_Hall_Of_Mists;
  1496.     }
  1497.  
  1498.     //
  1499.     // NPC's can go across too, but only if the bridge exists.
  1500.     //
  1501.     NPCexit1 = {
  1502.         if (CrystalBridge.exists)
  1503.             return On_East_Bank_Of_Fissure;
  1504.         else
  1505.             return nil;
  1506.     }
  1507. ;
  1508.  
  1509. Low_N_S_Passage: CCR_room
  1510.     sdesc = "Low N/S Passage"
  1511.     ldesc = {
  1512.         I(); "You are in a low N/S passage at a hole in the 
  1513.         floor.  The hole goes down to an E/W passage.";
  1514.     }
  1515.     hall = In_Hall_Of_Mt_King
  1516.     out = In_Hall_Of_Mt_King
  1517.     south = In_Hall_Of_Mt_King
  1518.     north = At_Y2
  1519.     y2 = At_Y2
  1520.     down = In_Dirty_Passage
  1521.     hole = In_Dirty_Passage
  1522. ;
  1523.  
  1524. In_South_Side_Chamber: CCR_room
  1525.     sdesc = "In South Side Chamber"
  1526.     ldesc = {
  1527.         I(); "You are in the south side chamber.";
  1528.     }
  1529.     hall = In_Hall_Of_Mt_King
  1530.     out = In_Hall_Of_Mt_King
  1531.     north = In_Hall_Of_Mt_King
  1532. ;
  1533.  
  1534. In_West_Side_Chamber: CCR_room
  1535.     sdesc = "In West Side Chamber"
  1536.     ldesc = {
  1537.         I(); "You are in the west side chamber of the hall of 
  1538.         the mountain king. A passage continues west and up 
  1539.         here.";
  1540.     }
  1541.     hall = In_Hall_Of_Mt_King
  1542.     out = In_Hall_Of_Mt_King
  1543.     east = In_Hall_Of_Mt_King
  1544.     west = Crossover
  1545.     up = Crossover
  1546. ;
  1547.  
  1548. At_Y2: CCR_room
  1549.     sdesc = "At \"Y2\""
  1550.     ldesc = {
  1551.         I(); "You are in a large room, with a passage to the 
  1552.         south, a passage to the west, and a wall of broken 
  1553.         rock to the east.  There is a large \"Y2\" on a rock 
  1554.         in the room's center.";
  1555.  
  1556.         self.hollowvoice;
  1557.     }
  1558.     plugh = Inside_Building
  1559.     south = Low_N_S_Passage
  1560.     east = Jumble_Of_Rock
  1561.     wall = Jumble_Of_Rock
  1562.     broken = Jumble_Of_Rock
  1563.     west = At_Window_On_Pit_1
  1564.      plover = {
  1565.         if (egg_sized_emerald.isIn(Me))
  1566.             egg_sized_emerald.moveInto(In_Plover_Room);
  1567.             
  1568.         return In_Plover_Room;
  1569.     }
  1570.  
  1571.     hollowvoice = {
  1572.         if (rand(100) <= 25) {
  1573.             P(); I(); "A hollow voice says, \"Plugh.\"";
  1574.         }
  1575.     }
  1576. ;
  1577. Y2Rock: CCR_decoration, chairitem, readable
  1578.     sdesc = "\"Y2\" rock"
  1579.     ldesc = { self.readdesc; }
  1580.     readdesc = "There is a large \"Y2\" painted on the rock."
  1581.     noun = 'rock'
  1582.     adjective = 'y2'
  1583.  
  1584.     location = At_Y2
  1585.  
  1586.     onroom = true    // We set ON the rock, not IN it.
  1587.  
  1588.     //
  1589.     // We wan't the player to be able to pick things in the
  1590.     // room up while sitting on the rock.
  1591.     //
  1592.     reachable = {
  1593.         return [Y2Rock] + At_Y2.contents;
  1594.     }
  1595. ;
  1596.  
  1597. Jumble_Of_Rock: CCR_room
  1598.     sdesc = "Jumble of Rock"
  1599.     ldesc = {
  1600.         I(); "You are in a jumble of rock, with cracks 
  1601.         everywhere.";
  1602.     }
  1603.     down = At_Y2
  1604.     y2 = At_Y2
  1605.     up = In_Hall_Of_Mists
  1606. ;
  1607.  
  1608. At_Window_On_Pit_1: CCR_room
  1609.     sdesc = "At Window on Pit"
  1610.     ldesc = {
  1611.         I(); "You're at a low window overlooking a huge pit, 
  1612.         which extends up out of sight.  A floor is 
  1613.         indistinctly visible over 50 feet below.  Traces of 
  1614.         white mist cover the floor of the pit, becoming 
  1615.         thicker to the right. Marks in the dust around the 
  1616.         window would seem to indicate that someone has been 
  1617.         here recently.  Directly across the pit from you and 
  1618.         25 feet away there is a similar window looking into a 
  1619.         lighted room.  A shadowy figure can be seen there 
  1620.         peering back at you.";
  1621.     }
  1622.     east = At_Y2
  1623.     y2 = At_Y2
  1624.     jump = { return broken_neck.death; }
  1625. ;
  1626. Window: floatingdecoration
  1627.     sdesc = "window"
  1628.     ldesc = "It looks like a regular window."
  1629.     noun = 'window'
  1630.     adjective = 'low'
  1631.     loclist = [ At_Window_On_Pit_1  At_Window_On_Pit_2 ]
  1632.  
  1633.     verDoOpen(actor) = {}
  1634.     doOpen(actor) = { "OK, the window is now open."; }
  1635.     verDoClose(actor) = {}
  1636.     doClose(actor) = { "OK, the window is now closed."; }
  1637. ;
  1638. WindowPit: floatingdecoration
  1639.     sdesc = "huge pit"
  1640.     ldesc = {
  1641.         "It's so deep you can barely make out the floor below,
  1642.         and the top isn't visible at all.";
  1643.     }
  1644.     noun = 'pit'
  1645.     adjective = 'deep' 'large'
  1646.     loclist = [ At_Window_On_Pit_1  At_Window_On_Pit_2 ]
  1647. ;
  1648. MarksInTheDust: floatingdecoration
  1649.     sdesc = "marks in the dust"
  1650.     adesc = { self.sdesc; }
  1651.     ldesc = "Evidently you're not alone here."
  1652.     loclist = [ At_Window_On_Pit_1  At_Window_On_Pit_2 ]
  1653. ;
  1654. ShadowyFigure: floatingdecoration
  1655.     sdesc = "shadowy figure"
  1656.     ldesc = {
  1657.         "The shadowy figure seems to be trying to attract 
  1658.         your attention.";
  1659.     }
  1660.     noun = 'figure' 'shadow' 'person' 'individual'
  1661.     adjective = 'shadowy' 'mysterious'
  1662.     loclist = [ At_Window_On_Pit_1  At_Window_On_Pit_2 ]
  1663. ;
  1664. In_Dirty_Passage: CCR_room
  1665.     sdesc = "In Dirty Passage"
  1666.     ldesc = {
  1667.         I(); "You are in a dirty broken passage.  To the east 
  1668.         is a crawl.  To the west is a large passage.  Above 
  1669.         you is a hole to another passage.";
  1670.     }
  1671.     east = On_Brink_Of_Pit
  1672.     crawl = On_Brink_Of_Pit
  1673.     up = Low_N_S_Passage
  1674.     hole = Low_N_S_Passage
  1675.     west = In_Dusty_Rock_Room
  1676.     bedquilt = In_Bedquilt
  1677.     slab = In_Slab_Room    // DMB: this is only in some versions
  1678. ;
  1679.  
  1680. On_Brink_Of_Pit: CCR_room
  1681.     sdesc = "On Brink of Pit"
  1682.     ldesc = {
  1683.         I(); "You are on the brink of a small clean climbable 
  1684.         pit.  A crawl leads west.";
  1685.     }
  1686.     west = In_Dirty_Passage
  1687.     crawl = In_Dirty_Passage
  1688.     down = In_Pit
  1689.     pit = In_Pit
  1690.     climb = In_Pit
  1691.     in = In_Pit    // DMB: added
  1692. ;
  1693. CleanPit: CCR_decoration
  1694.     sdesc = "small pit"
  1695.     ldesc = "It looks like you might be able to climb down into it."
  1696.     noun = 'pit'
  1697.     adjective = 'small' 'clean' 'climable'
  1698.     location = On_Brink_Of_Pit
  1699.  
  1700.     verDoClimb(actor) = {}
  1701.     doClimb(actor) = { Me.travelTo(self.location.climb); }
  1702.     verDoEnter(actor) = {}
  1703.     doEnter(actor) = { self.doClimb(actor); }
  1704. ;
  1705. In_Pit: CCR_room, NoNPC
  1706.     sdesc = "In Pit"
  1707.     ldesc = {
  1708.         I(); "You are in the bottom of a small pit with a 
  1709.         little stream, which enters and exits through tiny 
  1710.         slits.";
  1711.     }
  1712.     climb = On_Brink_Of_Pit
  1713.     up = On_Brink_Of_Pit
  1714.     out = On_Brink_Of_Pit
  1715.  
  1716.     slit = { return self.down; }
  1717.     stream = { return self.down; }
  1718.     upstream = { return self.down; }
  1719.     downstream = { return self.down; }
  1720.     down = {
  1721.         // In the original, the same message given
  1722.         // in At_Slit_In_Streambed was used here.
  1723.         // Since it's not quite right (and was probably only
  1724.         // reused to save space), I've changed it slightly.
  1725.  
  1726.         "You don't fit through the tiny slits!";
  1727.         return nil;
  1728.     }
  1729. ;
  1730. PitSlits: decoration
  1731.     sdesc = "tiny slits"
  1732.     adesc = { self.sdesc; }
  1733.     ldesc = {
  1734.         "The slits form a complex pattern in the rock.";
  1735.     }
  1736.     location = In_Pit
  1737.     noun = 'slit' 'slits'
  1738.     adjective = 'tiny'
  1739. ;
  1740.  
  1741. In_Dusty_Rock_Room: CCR_room
  1742.     sdesc = "In Dusty Rock Room"
  1743.     ldesc = {
  1744.         I(); "You are in a large room full of dusty rocks.  
  1745.         There is a big hole in the floor.  There are cracks 
  1746.         everywhere, and a passage leading east.";
  1747.     }
  1748.     east = In_Dirty_Passage
  1749.     passage = In_Dirty_Passage
  1750.     down = At_Complex_Junction
  1751.     hole = At_Complex_Junction
  1752.     floor = At_Complex_Junction
  1753.     bedquilt = In_Bedquilt
  1754. ;
  1755. DustyRocks: CCR_decoration
  1756.     sdesc = "dusty rocks"
  1757.     ldesc = "They're just rocks.  (Dusty ones, that is.)"
  1758.     location = In_Dusty_Rock_Room
  1759.     noun = 'rocks' 'boulders' 'stones' 'rock' 'boulder' 'stone'
  1760.     adjective = 'dusty' 'dirty'
  1761. ;
  1762.  
  1763. At_West_End_Of_Hall_Of_Mists: CCR_room
  1764.     sdesc = "At West End of Hall of Mists"
  1765.     ldesc = {
  1766.         I(); "You are at the west end of the hall of mists.  
  1767.         A low wide crawl continues west and another goes 
  1768.         north.  To the south is a little passage 6 feet off 
  1769.         the floor.";
  1770.     }
  1771.     south = Alike_Maze_1
  1772.     up = Alike_Maze_1
  1773.     passage = Alike_Maze_1
  1774.     climb = Alike_Maze_1
  1775.     east = West_Side_Of_Fissure
  1776.     west = At_East_End_Of_Long_Hall
  1777.     crawl = At_East_End_Of_Long_Hall
  1778.  
  1779.     north = {
  1780.         "You have crawled through a very low wide passage 
  1781.         parallel to and north of the hall of mists.\b";
  1782.  
  1783.         return West_Side_Of_Fissure;
  1784.     }    
  1785. ;
  1786.  
  1787. Alike_Maze_1: CCR_alike_maze_room
  1788.     up = At_West_End_Of_Hall_Of_Mists
  1789.     north = Alike_Maze_1
  1790.     east = Alike_Maze_2
  1791.     south = Alike_Maze_4
  1792.     west = Alike_Maze_11
  1793. ;
  1794.  
  1795. Alike_Maze_2: CCR_alike_maze_room
  1796.     west = Alike_Maze_1
  1797.     south = Alike_Maze_3
  1798.     east = Alike_Maze_4
  1799. ;
  1800.  
  1801. Alike_Maze_3: CCR_alike_maze_room
  1802.     east = Alike_Maze_2
  1803.     down = Dead_End_3
  1804.     south = Alike_Maze_6
  1805.     north = Dead_End_13
  1806. ;
  1807.  
  1808. Alike_Maze_4: CCR_alike_maze_room
  1809.     west = Alike_Maze_1
  1810.     north = Alike_Maze_2
  1811.     east = Dead_End_1
  1812.     south = Dead_End_2
  1813.     up = Alike_Maze_14
  1814.     down = Alike_Maze_14
  1815. ;
  1816.  
  1817. Dead_End_1: CCR_dead_end_room
  1818.     west = Alike_Maze_4
  1819.     out = Alike_Maze_4
  1820. ;
  1821.  
  1822. Dead_End_2: CCR_dead_end_room
  1823.     east = Alike_Maze_4
  1824.     out = Alike_Maze_4
  1825. ;
  1826.  
  1827. Dead_End_3: CCR_dead_end_room
  1828.     up = Alike_Maze_3
  1829.     out = Alike_Maze_3
  1830. ;
  1831.  
  1832. Alike_Maze_5: CCR_alike_maze_room
  1833.     east = Alike_Maze_6
  1834.     west = Alike_Maze_7
  1835. ;
  1836.  
  1837. Alike_Maze_6: CCR_alike_maze_room
  1838.     east = Alike_Maze_3
  1839.     west = Alike_Maze_5
  1840.     down = Alike_Maze_7
  1841.     south = Alike_Maze_8
  1842. ;
  1843.  
  1844. Alike_Maze_7: CCR_alike_maze_room
  1845.     west = Alike_Maze_5
  1846.     up = Alike_Maze_6
  1847.     east = Alike_Maze_8
  1848.     south = Alike_Maze_9
  1849. ;
  1850.  
  1851. Alike_Maze_8: CCR_alike_maze_room
  1852.     west = Alike_Maze_6
  1853.     east = Alike_Maze_7
  1854.     south = Alike_Maze_8
  1855.     up = Alike_Maze_9
  1856.     north = Alike_Maze_10
  1857.     down = Dead_End_12
  1858. ;
  1859.  
  1860. Alike_Maze_9: CCR_alike_maze_room
  1861.     west = Alike_Maze_7
  1862.     north = Alike_Maze_8
  1863.     south = Dead_End_4
  1864. ;
  1865.  
  1866. Dead_End_4: CCR_dead_end_room
  1867.     west = Alike_Maze_9
  1868.     out = Alike_Maze_9
  1869. ;
  1870.  
  1871. Alike_Maze_10: CCR_alike_maze_room
  1872.     west = Alike_Maze_8
  1873.     north = Alike_Maze_10
  1874.     down = Dead_End_5
  1875.     east = At_Brink_Of_Pit
  1876. ;
  1877.  
  1878. Dead_End_5: CCR_dead_end_room
  1879.     up = Alike_Maze_10
  1880.     out = Alike_Maze_10
  1881. ;
  1882.  
  1883. At_Brink_Of_Pit: CCR_room
  1884.     sdesc = "At Brink of Pit"
  1885.     ldesc = {
  1886.         I(); "You are on the brink of a thirty foot pit with 
  1887.         a massive orange column down one wall.  You could 
  1888.         climb down here but you could not get back up.  The 
  1889.         maze continues at this level.";
  1890.     }
  1891.     down = In_Bird_Chamber
  1892.     climb = In_Bird_Chamber
  1893.     west = Alike_Maze_10
  1894.     south = Dead_End_6
  1895.     north = Alike_Maze_12
  1896.     east = Alike_Maze_13
  1897. ;
  1898. OrangeColumn: CCR_decoration
  1899.     sdesc = "massive orange column"
  1900.     ldesc = "It looks like you could climb down it."
  1901.     noun = 'column'
  1902.     adjective = 'massive' 'orange' 'big' 'huge'
  1903.     location = At_Brink_Of_Pit
  1904.     
  1905.     verDoClimb(actor) = {}
  1906.     doClimb(actor) = { Me.travelTo(self.location.down); }
  1907. ;
  1908. ThirtyFootPit: CCR_decoration
  1909.     sdesc = "pit"
  1910.     ldesc = "You'll have to climb down to find out anything more..."
  1911.     noun = 'pit'
  1912.     adjective = 'thirty' 'foot' 'thirty-foot' '30-foot'
  1913.     location = At_Brink_Of_Pit
  1914.  
  1915.     verDoClimb(actor) = {}
  1916.     doClimb(actor) = { Me.travelTo(self.location.down); }
  1917.     verDoEnter(actor) = {}
  1918.     doEnter(actor) = { self.doClimb(actor); }
  1919. ;
  1920.  
  1921. Dead_End_6: CCR_dead_end_room
  1922.     east = At_Brink_Of_Pit
  1923.     out = At_Brink_Of_Pit
  1924. ;
  1925.  
  1926. At_East_End_Of_Long_Hall: CCR_room
  1927.     sdesc = "At East End of Long Hall"
  1928.     ldesc = {
  1929.         I(); "You are at the east end of a very long hall 
  1930.         apparently without side chambers.  To the east a low 
  1931.         wide crawl slants up.  To the north a round two foot 
  1932.         hole slants down.";
  1933.     }
  1934.     east = At_West_End_Of_Hall_Of_Mists
  1935.     up = At_West_End_Of_Hall_Of_Mists
  1936.     crawl = At_West_End_Of_Hall_Of_Mists
  1937.     west = At_West_End_Of_Long_Hall
  1938.     north = Crossover
  1939.     down = Crossover
  1940.     hole = Crossover
  1941. ;
  1942.  
  1943. At_West_End_Of_Long_Hall: CCR_room
  1944.     sdesc = "At West End of Long Hall"
  1945.     ldesc = {
  1946.         I(); "You are at the west end of a very long 
  1947.         featureless hall.  The hall joins up with a narrow 
  1948.         north/south passage.";
  1949.     }
  1950.     east = At_East_End_Of_Long_Hall
  1951.     north = Crossover
  1952.     south = Different_Maze_1
  1953. ;
  1954.  
  1955. Crossover: CCR_room
  1956.     sdesc = "N/S and E/W Crossover"
  1957.     ldesc = {
  1958.         I(); "You are at a crossover of a high N/S passage 
  1959.         and a low E/W one.";
  1960.     }
  1961.     west = At_East_End_Of_Long_Hall
  1962.     north = Dead_End_7
  1963.     east = In_West_Side_Chamber
  1964.     south = At_West_End_Of_Long_Hall
  1965. ;
  1966. TheCrossover: CCR_decoration
  1967.     sdesc = "crossover"
  1968.     ldesc = "You know as much as I do at this point."
  1969.     noun = 'crossover' 'over'
  1970.     adjective = 'cross'
  1971.     location = Crossover
  1972. ;
  1973.  
  1974. Dead_End_7: CCR_dead_end_room
  1975.     south = Crossover
  1976.     out = Crossover
  1977. ;
  1978.  
  1979. At_Complex_Junction: CCR_room
  1980.     sdesc = "At Complex Junction"
  1981.     ldesc = {
  1982.         I(); "You are at a complex junction.  A low hands and 
  1983.         knees passage from the north joins a higher crawl 
  1984.         from the east to make a walking passage going west.  
  1985.         There is also a large room above.  The air is damp 
  1986.         here.";
  1987.     }
  1988.     up = In_Dusty_Rock_Room
  1989.     climb = In_Dusty_Rock_Room
  1990.     toroom = In_Dusty_Rock_Room
  1991.     west = In_Bedquilt
  1992.     bedquilt = In_Bedquilt
  1993.     north = In_Shell_Room
  1994.     shell = In_Shell_Room
  1995.     east = In_Anteroom
  1996. ;
  1997.  
  1998. In_Bedquilt: CCR_room
  1999.     sdesc = "In Bedquilt"
  2000.     ldesc = {
  2001.         I(); "You are in bedquilt, a long east/west passage 
  2002.         with holes everywhere. To explore at random select 
  2003.         north, south, up, or down.";
  2004.     }
  2005.     east = At_Complex_Junction
  2006.     west = In_Swiss_Cheese_Room
  2007.     south = {
  2008.         if (rand(100) <= 80)
  2009.             return crawled_around.message;
  2010.         else
  2011.             return self.slab;
  2012.     }
  2013.     slab = In_Slab_Room
  2014.  
  2015.     up = {
  2016.         if (rand(100) <= 80)
  2017.             return crawled_around.message;
  2018.         else if (rand(100) <= 50)
  2019.             return In_Secret_N_S_Canyon_1;
  2020.         else
  2021.             return In_Dusty_Rock_Room;
  2022.     }
  2023.  
  2024.     north = {
  2025.         if (rand(100) <= 60)
  2026.             return crawled_around.message;
  2027.         else if (rand(100) <= 75)
  2028.             return In_Large_Low_Room;
  2029.         else
  2030.             return At_Junction_Of_Three_Secret_Canyons;
  2031.     }
  2032.  
  2033.     down = {
  2034.         if (rand(100) <= 80)
  2035.             return crawled_around.message;
  2036.         else
  2037.             return In_Anteroom;
  2038.     }
  2039.  
  2040.     //
  2041.     // Let the NPC's go everywhere out of here too.
  2042.     //
  2043.     NPCexit1 = In_Secret_N_S_Canyon_1
  2044.     NPCexit2 = In_Dusty_Rock_Room
  2045.     NPCexit3 = In_Large_Low_Room
  2046.     NPCexit4 = At_Junction_Of_Three_Secret_Canyons
  2047.     NPCexit5 = In_Anteroom
  2048. ;
  2049.  
  2050. In_Swiss_Cheese_Room: CCR_room
  2051.     sdesc = "In Swiss Cheese Room"
  2052.     ldesc = {
  2053.         I(); "You are in a room whose walls resemble swiss 
  2054.         cheese.  Obvious passages go west, east, ne, and nw.  
  2055.         Part of the room is occupied by a large bedrock 
  2056.         block.";
  2057.     }
  2058.     ne = In_Bedquilt
  2059.     west = At_East_End_Of_Twopit_Room
  2060.     south = {
  2061.         if (rand(100) <= 80)
  2062.             return crawled_around.message;
  2063.         else
  2064.             return self.canyon;
  2065.     }
  2066.     canyon = In_Tall_E_W_Canyon
  2067.  
  2068.     east = In_Soft_Room
  2069.     nw = {
  2070.         if (rand(100) <= 50)
  2071.             return crawled_around.message;
  2072.         else
  2073.             return self.oriental;
  2074.     }
  2075.     oriental = In_Oriental_Room
  2076. ;
  2077. BedrockBlock: CCR_decoration
  2078.     sdesc = "bedrock block"
  2079.     ldesc = "It's just a huge block."
  2080.     noun = 'block'
  2081.     adjective = 'bedrock' 'large'
  2082.     location = In_Swiss_Cheese_Room
  2083.  
  2084.     verDoLookunder(actor) = { "Surely you're joking."; }
  2085.     verDoMove(actor) = { self.verDoLookunder(actor); }
  2086.     verifyRemove(actor) = { self.verDoLookunder(actor); }
  2087. ;
  2088.  
  2089. At_East_End_Of_Twopit_Room: CCR_room
  2090.     sdesc = "At East End of Twopit Room"
  2091.     ldesc = {
  2092.         I(); "You are at the east end of the twopit room.  
  2093.         The floor here is littered with thin rock slabs, 
  2094.         which make it easy to descend the pits. There is a 
  2095.         path here bypassing the pits to connect passages from 
  2096.         east and west.  There are holes all over, but the 
  2097.         only big one is on the wall directly over the west 
  2098.         pit where you can't get to it.";
  2099.  
  2100.         if (PlantStickingUp.isIn(self)) {
  2101.             P(); I(); PlantStickingUp.ldesc;
  2102.         }
  2103.     }
  2104.     east = In_Swiss_Cheese_Room
  2105.     west = At_West_End_Of_Twopit_Room
  2106.     across = At_West_End_Of_Twopit_Room
  2107.     down = In_East_Pit
  2108.     pit = In_East_Pit
  2109. ;
  2110. Slabs: CCR_decoration
  2111.     sdesc = "thin rock slabs"
  2112.     adesc = { self.sdesc; }
  2113.     ldesc = "They almost form natural stairs down into the pit."
  2114.     noun = 'slabs' 'slab' 'rocks' 'stairs'
  2115.     adjective = 'thin' 'rock'
  2116.     location = At_East_End_Of_Twopit_Room
  2117.  
  2118.     verDoLookunder(actor) = { "Surely you're joking."; }
  2119.     verDoMove(actor) = { self.verDoLookunder(actor); }
  2120.     verifyRemove(actor) = { self.verDoLookunder(actor); }
  2121. ;
  2122.  
  2123. In_Slab_Room: CCR_room
  2124.     sdesc = "In Slab Room"
  2125.     ldesc = {
  2126.         I(); "You are in a large low circular chamber whose 
  2127.         floor is an immense slab fallen from the ceiling 
  2128.         (slab room).  East and west there once were large 
  2129.         passages, but they are now filled with boulders.  Low 
  2130.         small passages go north and south, and the south one 
  2131.         quickly bends west around the boulders.";
  2132.     }
  2133.     south = At_West_End_Of_Twopit_Room
  2134.     up = In_Secret_N_S_Canyon_0
  2135.     climb = In_Secret_N_S_Canyon_0
  2136.     north = In_Bedquilt
  2137. ;
  2138. Slab: CCR_decoration
  2139.     sdesc = "slab"
  2140.     ldesc = "It is now the floor here."
  2141.     noun = 'slab'
  2142.     adjective = 'immense'
  2143.     location = In_Slab_Room
  2144. ;
  2145. SlabBoulders: CCR_decoration
  2146.     sdesc = "boulders"
  2147.     ldesc = "They're just ordinary boulders."
  2148.     noun = 'boulder' 'boulders' 'rocks' 'stones'
  2149.     location = In_Slab_Room
  2150. ;
  2151.  
  2152. In_Secret_N_S_Canyon_0: CCR_room
  2153.     sdesc = "In Secret N/S Canyon"
  2154.     ldesc = {
  2155.         I(); "You are in a secret N/S canyon above a large 
  2156.         room.";
  2157.     }
  2158.     down = In_Slab_Room
  2159.     slab = In_Slab_Room
  2160.  
  2161.     south = {
  2162.         In_Secret_Canyon.enteredfrom := self;
  2163.         return In_Secret_Canyon;
  2164.     }
  2165.  
  2166.     north = In_Mirror_Canyon
  2167.     reservoir = At_Reservoir
  2168.  
  2169.     //
  2170.     // Let NPC's go into the secret canyon too, without regard to
  2171.     // whether the dragon's there.
  2172.     //
  2173.     NPCexit1 = In_Secret_Canyon
  2174. ;
  2175.  
  2176. In_Secret_N_S_Canyon_1: CCR_room
  2177.     sdesc = "In Secret N/S Canyon"
  2178.     ldesc = {
  2179.         I(); "You are in a secret N/S canyon above a sizable 
  2180.         passage.";
  2181.     }
  2182.     north = At_Junction_Of_Three_Secret_Canyons
  2183.     down = In_Bedquilt
  2184.     passage = In_Bedquilt
  2185.     south = Atop_Stalactite
  2186. ;
  2187.  
  2188. At_Junction_Of_Three_Secret_Canyons: CCR_room
  2189.     sdesc = "At Junction of Three Secret Canyons"
  2190.     ldesc = {
  2191.         I(); "You are in a secret canyon at a junction of 
  2192.         three canyons, bearing north, south, and se.  The 
  2193.         north one is as tall as the other two combined.";
  2194.     }
  2195.     se = In_Bedquilt
  2196.     south = In_Secret_N_S_Canyon_1
  2197.     north = At_Window_On_Pit_2
  2198. ;
  2199.  
  2200. In_Large_Low_Room: CCR_room
  2201.     sdesc = "In Large Low Room"
  2202.     ldesc = {
  2203.         I(); "You are in a large low room.  Crawls lead 
  2204.         north, se, and sw.";
  2205.     }
  2206.     bedquilt = In_Bedquilt
  2207.     sw = In_Sloping_Corridor
  2208.     north = Dead_End_Crawl
  2209.     se = In_Oriental_Room
  2210.     oriental = In_Oriental_Room
  2211. ;
  2212.  
  2213. Dead_End_Crawl: CCR_dead_end_room
  2214.     sdesc = "Dead End Crawl"
  2215.     ldesc = {
  2216.         I(); "This is a dead end crawl.";
  2217.     }
  2218.     south = In_Large_Low_Room
  2219.     crawl = In_Large_Low_Room
  2220.     out = In_Large_Low_Room
  2221. ;
  2222.  
  2223. In_Secret_E_W_Canyon: CCR_room
  2224.     sdesc = "In Secret E/W Canyon Above Tight Canyon"
  2225.     ldesc = {
  2226.         I(); "You are in a secret canyon which here runs E/W. 
  2227.         It crosses over a very tight canyon 15 feet below.  
  2228.         If you go down you may not be able to get back up.";
  2229.     }
  2230.     east = In_Hall_Of_Mt_King
  2231.     west = {
  2232.         In_Secret_Canyon.enteredfrom := self;
  2233.         return In_Secret_Canyon;
  2234.     }
  2235.     down = In_N_S_Canyon
  2236.  
  2237.     //
  2238.     // Let NPC's go into the secret canyon too, without regard to
  2239.     // whether the dragon's there.
  2240.     //
  2241.     NPCexit1 = In_Secret_Canyon
  2242. ;
  2243.  
  2244. In_N_S_Canyon: CCR_room
  2245.     sdesc = "In N/S Canyon"
  2246.     ldesc = {
  2247.         I(); "You are at a wide place in a very tight N/S 
  2248.         canyon.";
  2249.     }
  2250.     south = Canyon_Dead_End
  2251.     north = In_Tall_E_W_Canyon
  2252. ;
  2253.  
  2254. Canyon_Dead_End: CCR_dead_end_room
  2255.     sdesc = "Canyon Dead End"
  2256.     ldesc = {
  2257.         I(); "The canyon here becomes too tight to go further 
  2258.         south.";
  2259.     }
  2260.     north = In_N_S_Canyon
  2261. ;
  2262.  
  2263. In_Tall_E_W_Canyon: CCR_room
  2264.     sdesc = "In Tall E/W Canyon"
  2265.     ldesc = {
  2266.         I(); "You are in a tall E/W canyon.  A low tight 
  2267.         crawl goes 3 feet north and seems to open up.";
  2268.     }
  2269.     east = In_N_S_Canyon
  2270.     west = Dead_End_8
  2271.     north = In_Swiss_Cheese_Room
  2272.     crawl = In_Swiss_Cheese_Room
  2273. ;
  2274.  
  2275. Dead_End_8: CCR_dead_end_room
  2276.     ldesc = {
  2277.         I(); "The canyon runs into a mass of boulders -- dead 
  2278.         end.";
  2279.     }
  2280.     south = In_Tall_E_W_Canyon
  2281.     out = In_Tall_E_W_Canyon    // DMB: added
  2282. ;
  2283. MassOfBoulders: CCR_decoration
  2284.     sdesc = "mass of boulders"
  2285.     ldesc = "They just like ordinary boulders."
  2286.     noun = 'boulders' 'mass'
  2287.     location = Dead_End_8
  2288. ;
  2289.  
  2290. Alike_Maze_11: CCR_alike_maze_room
  2291.     north = Alike_Maze_1
  2292.     west = Alike_Maze_11
  2293.     south = Alike_Maze_11
  2294.     east = Dead_End_9
  2295. ;
  2296.  
  2297. Dead_End_9: CCR_dead_end_room
  2298.     west = Alike_Maze_11
  2299.     out = Alike_Maze_11
  2300. ;
  2301.  
  2302. Dead_End_10: CCR_dead_end_room
  2303.     south = Alike_Maze_3
  2304.     out = Alike_Maze_3
  2305. ;
  2306.  
  2307. Alike_Maze_12: CCR_alike_maze_room
  2308.     south = At_Brink_Of_Pit
  2309.     east = Alike_Maze_13
  2310.     west = Dead_End_11
  2311. ;
  2312.  
  2313. Alike_Maze_13: CCR_alike_maze_room
  2314.     north = At_Brink_Of_Pit
  2315.     west = Alike_Maze_12
  2316.     nw = Dead_End_13
  2317. ;
  2318.  
  2319. Dead_End_11: CCR_dead_end_room
  2320.     east = Alike_Maze_12
  2321.     out = Alike_Maze_12
  2322. ;
  2323.  
  2324. Dead_End_12: CCR_dead_end_room
  2325.     up = Alike_Maze_8
  2326.     out = Alike_Maze_8
  2327. ;
  2328.  
  2329. Alike_Maze_14: CCR_alike_maze_room
  2330.     up = Alike_Maze_4
  2331.     down = Alike_Maze_4
  2332. ;
  2333.  
  2334. In_Narrow_Corridor: CCR_room
  2335.     sdesc = "In Narrow Corridor"
  2336.     ldesc = {
  2337.         I(); "You are in a long, narrow corridor stretching 
  2338.         out of sight to the west.  At the eastern end is a 
  2339.         hole through which you can see a profusion of 
  2340.         leaves.";
  2341.     }
  2342.     down = In_West_Pit
  2343.     climb = In_West_Pit
  2344.     east = In_West_Pit
  2345.     jump = { return broken_neck.death; }
  2346.     west = In_Giant_Room
  2347.     giant = In_Giant_Room
  2348. ;
  2349. Leaves: CCR_decoration
  2350.     sdesc = "leaves"
  2351.     ldesc = {
  2352.         "The leaves appear to be attached to the beanstalk 
  2353.         you climbed to get here.";
  2354.     }
  2355.     location = In_Narrow_Corridor
  2356.     noun = 'leaf' 'leaves' 'plant' 'tree' 'stalk' 'beanstalk' 'profusion'
  2357. ;
  2358.  
  2359. At_Steep_Incline_Above_Large_Room: CCR_room
  2360.     sdesc = "At Steep Incline Above Large Room"
  2361.     ldesc = {
  2362.         I(); "You are at the top of a steep incline above a 
  2363.         large room.  You could climb down here, but you would 
  2364.         not be able to climb up.  There is a passage leading 
  2365.         back to the north.";
  2366.     }
  2367.     north = In_Cavern_With_Waterfall
  2368.     cavern = In_Cavern_With_Waterfall
  2369.     passage = In_Cavern_With_Waterfall
  2370.     down = In_Large_Low_Room
  2371.     climb = In_Large_Low_Room
  2372. ;
  2373.  
  2374. In_Giant_Room: CCR_room
  2375.     sdesc = "In Giant Room"
  2376.     ldesc = {
  2377.         I(); "You are in the giant room.  The ceiling here is 
  2378.         too high up for your lamp to show it.  Cavernous 
  2379.         passages lead east, north, and south.  On the west 
  2380.         wall is scrawled the inscription, \"Fee fie foe foo\" 
  2381.         [sic].";
  2382.     }
  2383.     south = In_Narrow_Corridor
  2384.     east = At_Recent_Cave_In
  2385.     north = In_Immense_N_S_Passage
  2386. ;
  2387. Inscription: CCR_decoration, readable
  2388.     sdesc = "scrawled inscription"
  2389.     ldesc = "It says, \"Fee fie foe foo [sic].\""
  2390.     noun = 'inscription' 'writing' 'scrawl'
  2391.     adjective = 'scrawled'
  2392.     location = In_Giant_Room
  2393. ;
  2394.  
  2395. At_Recent_Cave_In: CCR_room
  2396.     sdesc = "At Recent Cave-in"
  2397.     ldesc = {
  2398.         I(); "The passage here is blocked by a recent 
  2399.         cave-in.";
  2400.     }
  2401.     south = In_Giant_Room
  2402.     giant = In_Giant_Room
  2403.     out = In_Giant_Room
  2404. ;
  2405. CaveIn: CCR_decoration
  2406.     sdesc = "cave-in"
  2407.     ldesc = { self.location.ldesc; }
  2408.     noun = 'in' 'cave-in'
  2409.     adjective = 'cave'
  2410.     location = At_Recent_Cave_In
  2411. ;
  2412.  
  2413. In_Immense_N_S_Passage: CCR_room
  2414.     sdesc = "In Immense N/S Passage"
  2415.     ldesc = {
  2416.         I(); "You are at one end of an immense north/south 
  2417.         passage. ";
  2418.  
  2419.         if (not RustyDoor.isoiled)
  2420.              "The way north is barred by a massive, rusty, 
  2421.             iron door.";
  2422.         else
  2423.             "The way north leads through a massive, 
  2424.             rusty, iron door.";
  2425.     }
  2426.     south = In_Giant_Room
  2427.     giant = In_Giant_Room
  2428.     passage = In_Giant_Room
  2429.  
  2430.     enter = { return self.north; }
  2431.     cavern = { return self.north; }
  2432.     north = {
  2433.         if (RustyDoor.isoiled) {
  2434.             return In_Cavern_With_Waterfall;
  2435.         }
  2436.         else {
  2437.             "The door is extremely rusty and refuses to open.";
  2438.             return nil;
  2439.         }
  2440.     }
  2441.  
  2442.     //
  2443.     // Only let NPC's go through the door once it's open.
  2444.     //
  2445.     NPCexit1 = {
  2446.         if (RustyDoor.isoiled)
  2447.             return In_Cavern_With_Waterfall;
  2448.         else
  2449.             return nil;
  2450.     }
  2451. ;
  2452. RustyDoor: CCR_decoration
  2453.     isoiled = nil
  2454.  
  2455.     sdesc = "rusty door"
  2456.     ldesc = "It's just a big iron door."
  2457.     location = In_Immense_N_S_Passage
  2458.     noun = 'door' 'hinge' 'hinges'
  2459.     adjective = 'massive' 'rusty' 'iron'
  2460.  
  2461.     verDoOpen(actor) = {
  2462.         if (self.oiled)
  2463.             "It's already open.";
  2464.         else
  2465.             "The hinges are quite thoroughly rusted now 
  2466.             and won't budge.";
  2467.     }
  2468.     verDoClose(actor) = {
  2469.         if (self.oiled)
  2470.             "No problem there -- it already is.";
  2471.         else
  2472.             "With all the effort it took to get the door 
  2473.             open, I wouldn't suggest closing it again.";
  2474.     }
  2475.     verDoOil(actor) = {}
  2476.     doOil(actor) = {
  2477.         if (bottle.isIn(Me))
  2478.             bottle.doPourOn(actor, self);
  2479.         else
  2480.             "You have nothing to oil it with.";
  2481.     }
  2482. ;
  2483.  
  2484. In_Cavern_With_Waterfall: CCR_room
  2485.     sdesc = "In Cavern With Waterfall"
  2486.     ldesc = {
  2487.         I(); "You are in a magnificent cavern with a rushing 
  2488.         stream, which cascades over a sparkling waterfall 
  2489.         into a roaring whirlpool which disappears through a 
  2490.         hole in the floor.  Passages exit to the south and 
  2491.         west.";
  2492.     }
  2493.     south = In_Immense_N_S_Passage
  2494.     out = In_Immense_N_S_Passage
  2495.     giant = In_Giant_Room
  2496.     west = At_Steep_Incline_Above_Large_Room
  2497. ;
  2498. Waterfall: CCR_decoration
  2499.     sdesc = "waterfall"
  2500.     ldesc = "Wouldn't want to go down in in a barrel!"
  2501.     noun = 'waterfall' 'whirpool'
  2502.     adjective = 'sparkling' 'whirling'
  2503.     location = In_Cavern_With_Waterfall
  2504. ;
  2505.  
  2506. In_Soft_Room: CCR_room
  2507.     sdesc = "In Soft Room"
  2508.     ldesc = {
  2509.         I(); "You are in the soft room.  The walls are 
  2510.         covered with heavy curtains, the floor with a thick 
  2511.         pile carpet.  Moss covers the ceiling.";
  2512.     }
  2513.     west = In_Swiss_Cheese_Room
  2514.     out = In_Swiss_Cheese_Room
  2515. ;
  2516. Carpet: CCR_decoration
  2517.     sdesc = "carpet"
  2518.     ldesc = "The carpet is quite plush."
  2519.     noun = 'carpet' 'shag' 'pile'
  2520.     adjective = 'pile' 'heavy' 'thick'
  2521.     location = In_Soft_Room
  2522. ;
  2523. Curtains: CCR_decoration
  2524.     sdesc = "curtains"
  2525.     ldesc = "They seem to absorb sound very well."
  2526.     noun = 'curtain' 'curtains'
  2527.     adjective = 'heavy' 'thick'
  2528.     location = In_Soft_Room
  2529.  
  2530.     verifyRemove(actor) = { "Now don't go ripping up the place!"; }
  2531.     verDoLookbehind(actor) = {}
  2532.     doLookbehind(actor) = {
  2533.         "You don't find anything exciting behind the curtains.";
  2534.     }
  2535. ;
  2536. Moss: CCR_decoration
  2537.     sdesc = "moss"
  2538.     ldesc = "It just looks like your typical, everyday moss."
  2539.     noun = 'moss'
  2540.     adjective = 'typical' 'everyday'
  2541.     location = In_Soft_Room
  2542.  
  2543.     verifyRemove(actor) = { "It's too high up for you to reach."; }
  2544.     verDoEat(actor) = { "Eeeewwwww."; }
  2545. ;
  2546.  
  2547. In_Oriental_Room: CCR_room
  2548.     sdesc = "In Oriental Room"
  2549.     ldesc = {
  2550.         I(); "This is the oriental room.  Ancient oriental 
  2551.         cave drawings cover the walls.  A gently sloping 
  2552.         passage leads upward to the north, another passage 
  2553.         leads se, and a hands and knees crawl leads west.";
  2554.     }
  2555.     se = In_Swiss_Cheese_Room
  2556.     west = In_Large_Low_Room
  2557.     crawl = In_Large_Low_Room
  2558.     up = In_Misty_Cavern
  2559.     north = In_Misty_Cavern
  2560.     cavern = In_Misty_Cavern
  2561. ;
  2562. CaveDrawings: CCR_decoration
  2563.     sdesc = "ancient oriental drawings"
  2564.     ldesc = "They seem to depict people and animals."
  2565.     noun = 'paintings' 'drawings' 'art'
  2566.     adjective = 'cave' 'ancient' 'oriental'
  2567.     location = In_Oriental_Room
  2568. ;
  2569.  
  2570. In_Misty_Cavern: CCR_room
  2571.     sdesc = "In Misty Cavern"
  2572.     ldesc = {
  2573.         I(); "You are following a wide path around the outer 
  2574.         edge of a large cavern. Far below, through a heavy 
  2575.         white mist, strange splashing noises can be heard.  
  2576.         The mist rises up through a fissure in the ceiling.  
  2577.         The path exits to the south and west.";
  2578.     }
  2579.     south = In_Oriental_Room
  2580.     oriental = In_Oriental_Room
  2581.     west = In_Alcove
  2582. ;
  2583. CeilingFissure: CCR_decoration
  2584.     sdesc = "fissure"
  2585.     ldesc = "You can't really get close enough to examine it."
  2586.     noun = 'fissure'
  2587.     location = In_Misty_Cavern
  2588. ;
  2589.  
  2590. In_Alcove: CCR_room
  2591.     sdesc = "In Alcove"
  2592.     ldesc = {
  2593.         I(); "You are in an alcove.  A small northwest path seems 
  2594.         to widen after a short distance.  An extremely tight 
  2595.         tunnel leads east.  It looks like a very tight 
  2596.         squeeze.  An eerie light can be seen at the other 
  2597.         end.";
  2598.     }
  2599.     nw = In_Misty_Cavern
  2600.     cavern = In_Misty_Cavern
  2601.     passage = { return self.east; }
  2602.     east = {
  2603.         //
  2604.         // The player must be carrying only the emerald or
  2605.         // nothing at all to fit through the tight tunnel.
  2606.         //
  2607.         if (length(Me.contents) > 1)
  2608.             return wontfit.message;
  2609.         else if (length(Me.contents) = 1) {
  2610.             if (egg_sized_emerald.isIn(Me))
  2611.                 return In_Plover_Room;
  2612.             else
  2613.                 return wontfit.message;
  2614.         }
  2615.         else
  2616.             return In_Plover_Room;
  2617.     }
  2618.  
  2619.     //
  2620.     // Let NPC's go in the plover room regardless of what
  2621.     // they're carrying.  (Life's not fair in the Colossal Cave.)
  2622.     //
  2623.     NPCexit1 = In_Plover_Room
  2624. ;
  2625.  
  2626. In_Plover_Room: CCR_room, lightroom
  2627.     sdesc = "In Plover Room"
  2628.     ldesc = {
  2629.         I(); "You're in a small chamber lit by an eerie green 
  2630.         light.  An extremely narrow tunnel exits to the west. 
  2631.         A dark corridor leads northeast.";
  2632.     }
  2633.  
  2634.     passage = { return self.west; }
  2635.     out =  { return self.west; }
  2636.     west = {
  2637.         //
  2638.         // The player must be carrying only the emerald or
  2639.         // nothing at all to fit through the tight tunnel.
  2640.         //
  2641.         if (length(Me.contents) > 1)
  2642.             return wontfit.message;
  2643.         else if (length(Me.contents) = 1) {
  2644.             if (egg_sized_emerald.isIn(Me))
  2645.                 return In_Alcove;
  2646.             else
  2647.                 return wontfit.message;
  2648.         }
  2649.         else
  2650.             return In_Alcove;
  2651.     }
  2652.  
  2653.     ne = In_Dark_Room
  2654.     dark = In_Dark_Room
  2655.  
  2656.      plover = At_Y2
  2657.  
  2658.     //
  2659.     // Let NPC's leave the plover room regardless of what
  2660.     // they're carrying.  (Life's not fair in the Colossal Cave.)
  2661.     //
  2662.     NPCexit1 = In_Alcove
  2663. ;
  2664.  
  2665. In_Dark_Room: CCR_room
  2666.     sdesc = "In Dark Room"
  2667.     ldesc = {
  2668.         I(); "You're in the dark-room.  A corridor leading 
  2669.         south is the only exit."; P();
  2670.  
  2671.         I(); StoneTablet.ldesc; 
  2672.     }
  2673.     south = In_Plover_Room
  2674.     plover = In_Plover_Room
  2675.     out = In_Plover_Room
  2676. ;
  2677. StoneTablet: CCR_decoration
  2678.     sdesc = "stone tablet"
  2679.     ldesc = {
  2680.         "A massive stone tablet imbedded in the wall reads: 
  2681.         \"Congratulations on bringing light into the 
  2682.         dark-room!\"";
  2683.     }
  2684.     location = In_Dark_Room
  2685.     noun = 'tablet'
  2686.     adjective = 'massive' 'stone'
  2687. ;
  2688.  
  2689. In_Arched_Hall: CCR_room
  2690.     sdesc = "In Arched Hall"
  2691.     ldesc = {
  2692.         I(); "You are in an arched hall.  A coral passage 
  2693.         once continued up and east from here, but is now 
  2694.         blocked by debris.  The air smells of sea water.";
  2695.     }
  2696.     down = In_Shell_Room
  2697.     shell = In_Shell_Room
  2698.     out = In_Shell_Room
  2699. ;
  2700.  
  2701. In_Shell_Room: CCR_room
  2702.     sdesc = "In Shell Room"
  2703.     ldesc = {
  2704.         I(); "You're in a large room carved out of 
  2705.         sedimentary rock.  The floor and walls are littered 
  2706.         with bits of shells imbedded in the stone.  A shallow 
  2707.         passage proceeds downward, and a somewhat steeper one 
  2708.         leads up.  A low hands and knees passage enters from 
  2709.         the south.";
  2710.     }
  2711.     up = In_Arched_Hall
  2712.     hall = In_Arched_Hall
  2713.     down = In_Ragged_Corridor
  2714.     
  2715.     south = {
  2716.         if (giant_bivalve.isIn(Me)) {
  2717.             if (giant_bivalve.opened)
  2718.                 "You can't fit this five-foot oyster 
  2719.                 through that little passage!";
  2720.             else
  2721.                 "You can't fit this five-foot clam 
  2722.                 through that little passage!";
  2723.  
  2724.             return nil;
  2725.         }
  2726.         else 
  2727.             return At_Complex_Junction;
  2728.     }
  2729.  
  2730.     //
  2731.     // Let NPC's through.
  2732.     //
  2733.     NPCexit1 = At_Complex_Junction
  2734. ;
  2735.  
  2736. In_Ragged_Corridor: CCR_room
  2737.     sdesc = "In Ragged Corridor"
  2738.     ldesc = {
  2739.         I(); "You are in a long sloping corridor with ragged 
  2740.         sharp walls.";
  2741.     }
  2742.     up = In_Shell_Room
  2743.     shell = In_Shell_Room
  2744.     down = In_A_Cul_De_Sac
  2745. ;
  2746.  
  2747. In_A_Cul_De_Sac: CCR_room
  2748.     sdesc = "In a Cul-de-Sac"
  2749.     ldesc = {
  2750.         I(); "You are in a cul-de-sac about eight feet 
  2751.         across.";
  2752.     }
  2753.     up = In_Ragged_Corridor
  2754.     out = In_Ragged_Corridor
  2755.     shell = In_Shell_Room
  2756. ;
  2757.  
  2758. In_Anteroom: CCR_room
  2759.     sdesc = "In Anteroom"
  2760.     ldesc = {
  2761.         I(); "You are in an anteroom leading to a large 
  2762.         passage to the east.  Small passages go west and up.  
  2763.         The remnants of recent digging are evident."; P();
  2764.  
  2765.         I(); "A sign in midair here says \"Cave under 
  2766.         construction beyond this point. Proceed at own risk.  
  2767.         [Witt Construction Company]\"";
  2768.     }
  2769.     up = At_Complex_Junction
  2770.     west = In_Bedquilt
  2771.     east = At_Witts_End
  2772. ;
  2773. WittSign: CCR_decoration, readable
  2774.     sdesc = 'sign'
  2775.     ldesc = "It's hanging way above your head."
  2776.     readdesc = {
  2777.         "It says \"Cave under construction beyond this point. 
  2778.         Proceed at own risk.  [Witt Construction Company]\"";
  2779.     }
  2780.     noun = 'sign'
  2781.     adjective = 'hanging'
  2782.     location = In_Anteroom
  2783.  
  2784.     verifyRemove(actor) = { "No chance.  It's too far up."; }
  2785. ;
  2786.  
  2787. /*
  2788.  * This was off limits to NPC's in the original, but I don't see
  2789.  * any reason to keep that restriction since it seemed to be
  2790.  * related to some hackery in the way the movement worked.
  2791.  *
  2792.  * It could be argued that the pirate shouldn't show up in the mazes,
  2793.  * since his taking stuff away from the player could make mapping the
  2794.  * maze a real pain.
  2795.  */
  2796. Different_Maze_1: CCR_room
  2797.     sdesc = "Maze of Twisty Little Passages, All Different"
  2798.     ldesc = {
  2799.         I(); "You are in a maze of twisty little passages, 
  2800.         all different.";
  2801.     }
  2802.     south = Different_Maze_3
  2803.     sw = Different_Maze_4
  2804.     ne = Different_Maze_5
  2805.     se = Different_Maze_6
  2806.     up = Different_Maze_7
  2807.     nw = Different_Maze_8
  2808.     east = Different_Maze_9
  2809.     west = Different_Maze_10
  2810.     north = Different_Maze_11
  2811.     down = At_West_End_Of_Long_Hall
  2812. ;
  2813.  
  2814. At_Witts_End: CCR_room
  2815.     sdesc = "At Witt's End"
  2816.     ldesc = {
  2817.         I(); "You are at Witt's End.  Passages lead off in 
  2818.         *all* directions.";
  2819.     }
  2820.     east = {
  2821.         if (rand(100) <= 95) 
  2822.             return crawled_around.message;
  2823.         else
  2824.             return In_Anteroom;
  2825.     }
  2826.     west = {
  2827.         "You have crawled around in some little holes and 
  2828.         found your way blocked by a recent cave-in.  You are 
  2829.         now back in the main passage.";
  2830.  
  2831.         return nil;
  2832.     }
  2833.  
  2834.     north = { return self.east; }
  2835.     south = { return self.east; }
  2836.     ne = { return self.east; }
  2837.     se = { return self.east; }
  2838.     sw = { return self.east; }
  2839.     nw = { return self.east; }
  2840.     up = { return self.east; }
  2841.     down = { return self.east; }
  2842.  
  2843.     //
  2844.     // Let NPC's out of here with no trouble
  2845.     //
  2846.     NPCexit1 = In_Anteroom
  2847. ;
  2848.  
  2849. In_Mirror_Canyon: CCR_room
  2850.     sdesc = "In Mirror Canyon"
  2851.     ldesc = {
  2852.         I(); "You are in a north/south canyon about 25 feet 
  2853.         across.  The floor is covered by white mist seeping 
  2854.         in from the north.  The walls extend upward for well 
  2855.         over 100 feet.  Suspended from some unseen point far 
  2856.         above you, an enormous two-sided mirror is hanging 
  2857.         parallel to and midway between the canyon walls. ";
  2858.  
  2859.         "("; CanyonMirror.ldesc; ")"; 
  2860.  
  2861.         P(); I(); "A small window can be seen in either wall, 
  2862.         some fifty feet up.";
  2863.     }
  2864.     south = In_Secret_N_S_Canyon_0
  2865.     north = At_Reservoir
  2866.     reservior = At_Reservoir
  2867. ;
  2868. Mirror_1: CCR_decoration
  2869.     sdesc = "enormous mirror"
  2870.     ldesc = "It looks like an ordinary, albeit enormous, mirror."
  2871.     location = In_Mirror_Canyon
  2872.     noun = 'mirror'
  2873.     adjective = 'enormous' 'huge' 'big' 'large' 'suspended'
  2874.         'hanging' 'vanity' 'dwarvish'
  2875.  
  2876.     verDoBreak(actor) = { self.verifyRemove(actor); }
  2877.     verifyRemove(actor) = { "You can't reach it from here."; }
  2878. ;
  2879. CanyonMirror: CCR_decoration
  2880.     sdesc = "suspended mirror"
  2881.     ldesc = {
  2882.         "The mirror is obviously provided for the use of the 
  2883.         dwarves, who as you know, are extremely vain.";
  2884.     }
  2885.     noun = 'mirror'
  2886.     adjective = 'massive' 'hanging' 'suspended' 'dwarves\'' 'two-sided'
  2887.         'two' 'sided'
  2888.     location = In_Mirror_Canyon
  2889. ;
  2890.  
  2891. At_Window_On_Pit_2: CCR_room
  2892.     sdesc = "At Window on Pit"
  2893.     ldesc = {
  2894.         I(); "You're at a low window overlooking a huge pit, 
  2895.         which extends up out of sight.  A floor is 
  2896.         indistinctly visible over 50 feet below.  Traces of 
  2897.         white mist cover the floor of the pit, becoming 
  2898.         thicker to the left. Marks in the dust around the 
  2899.         window would seem to indicate that someone has been 
  2900.         here recently.  Directly across the pit from you and 
  2901.         25 feet away there is a similar window looking into a 
  2902.         lighted room.  A shadowy figure can be seen there 
  2903.         peering back at you.";
  2904.     }
  2905.     west = At_Junction_Of_Three_Secret_Canyons
  2906.     jump = { return broken_neck.death; }
  2907. ;
  2908.  
  2909. Atop_Stalactite: CCR_room
  2910.     sdesc = "Atop Stalactite"
  2911.     ldesc = {
  2912.         I(); "A large stalactite extends from the roof and 
  2913.         almost reaches the floor below.  You could climb down 
  2914.         it, and jump from it to the floor, but having done so 
  2915.         you would be unable to reach it to climb back up.";
  2916.     }
  2917.     north = In_Secret_N_S_Canyon_1
  2918.  
  2919.     jump = { return self.down; }
  2920.     climb = { return self.down; }
  2921.     down = {
  2922.         if (rand(100) <= 40)
  2923.             return Alike_Maze_6;
  2924.         else if (rand(100) <= 50)
  2925.             return Alike_Maze_9;
  2926.         else
  2927.             return Alike_Maze_4;
  2928.     }
  2929.  
  2930.     //
  2931.     // Let NPC's through to the maze
  2932.     //
  2933.     NPCexit1 = Alike_Maze_6
  2934.     NPCexit2 = Alike_Maze_9
  2935.     NPCexit3 = Alike_Maze_4
  2936. ;
  2937. Stalactite: CCR_decoration
  2938.     sdesc = "stalactite"
  2939.     ldesc = {
  2940.         "You could probably climb down it, but you can forget 
  2941.         coming back up.";
  2942.     }
  2943.     noun = 'stalactite' 'stalagmite' 'stalagtite'
  2944.     adjective = 'large'
  2945.     location = Atop_Stalactite
  2946.  
  2947.     verDoLookunder(actor) = { "Do get a grip on yourself."; }
  2948.     verDoMove(actor) = { self.verDoLookunder(actor); }
  2949.     verifyRemove(actor) = { self.verDoLookunder(actor); }
  2950. ;
  2951.  
  2952. Different_Maze_2: CCR_room
  2953.     sdesc = "Little Maze of Twisting Passages, All Different"
  2954.     ldesc = {
  2955.         I(); "You are in a little maze of twisting passages, 
  2956.         all different.";
  2957.     }
  2958.     sw = Different_Maze_3
  2959.     north = Different_Maze_4
  2960.     east = Different_Maze_5
  2961.     nw = Different_Maze_6
  2962.     se = Different_Maze_7
  2963.     ne = Different_Maze_8
  2964.     west = Different_Maze_9
  2965.     down = Different_Maze_10
  2966.     up = Different_Maze_11
  2967.     south = Dead_End_14
  2968. ;
  2969.  
  2970. At_Reservoir: CCR_room
  2971.     sdesc = "At Reservoir"
  2972.     ldesc = {
  2973.         I(); "You are at the edge of a large underground 
  2974.         reservoir.  An opaque cloud of white mist fills the 
  2975.         room and rises rapidly upward.  The lake is fed by a 
  2976.         stream, which tumbles out of a hole in the wall about 
  2977.         10 feet overhead and splashes noisily into the water 
  2978.         somewhere within the mist.  The only passage goes 
  2979.         back toward the south.";
  2980.     }
  2981.     south = In_Mirror_Canyon
  2982.     out = In_Mirror_Canyon
  2983.  
  2984.     //
  2985.     // The original had another exit, but the verb it was attached
  2986.     // to didn't exists.  I have no idea what was intended here...
  2987.     //
  2988.     // ??? = In_Mirror_Canyon
  2989. ;
  2990.  
  2991. //
  2992. // Here's where the pirate(s) keeps his treasure (as well as any loot
  2993. // he's swiped from the player).  Once the chest has been been found
  2994. // here, turn off the pirate(s) completely.  (This is how the original
  2995. // handled it, and it's thankfully merciful so I've kept it the same.)
  2996. //
  2997. Dead_End_13: CCR_dead_end_room, NoNPC
  2998.     se = Alike_Maze_13
  2999.     out = Alike_Maze_13    // DMB: added
  3000.  
  3001.     ldesc = "This is the pirate's dead end."
  3002.  
  3003.     enterRoom(actor) = {
  3004.         if (treasure_chest.isIn(Me) and not treasure_chest.spotted) {
  3005.             P(); I(); "You've found the pirate's treasure chest!";
  3006.             unnotify(Pirates, &move);
  3007.             treasure_chest.spotted := true;
  3008.             PirateMessage.moveInto(nil);
  3009.         }
  3010.  
  3011.         pass enterRoom;
  3012.     }
  3013. ;
  3014.  
  3015. On_Sw_Side_Of_Chasm: CCR_room
  3016.     sdesc = "On SW Side of Chasm"
  3017.     ldesc = {
  3018.         I(); "You are on one side of a large, deep chasm.  A 
  3019.         heavy white mist rising up from below obscures all 
  3020.         view of the far side.  A southwest path leads away 
  3021.         from the chasm into a winding corridor. ";
  3022.  
  3023.         RicketyBridge.xdesc;
  3024.  
  3025.         if (Troll.location = nil) {
  3026.             P(); I();
  3027.             "The troll is nowhere to be seen.";
  3028.         }
  3029.     }
  3030.     sw = In_Sloping_Corridor
  3031.  
  3032.     across = { return self.over; }
  3033.     cross = { return self.over; }
  3034.     ne = { return self.over; }
  3035.     over = {
  3036.         RicketyBridge.doCross(Me);
  3037.         return nil;
  3038.     }
  3039.     
  3040.     jump = {
  3041.         if (RicketyBridge.exists) {
  3042.             "I respectfully suggest you go across the 
  3043.             bridge instead of jumping.";
  3044.  
  3045.             return nil;
  3046.         }
  3047.         else
  3048.             return didnt_make_it.death;
  3049.     }
  3050.  
  3051.     //
  3052.     // No NPC exits because we don't want the pirate to be able
  3053.     // to go across the bridge and steal the player's return toll.
  3054.     // (All rooms on the other side of the bridge are off limits
  3055.     // to NPC's.)
  3056.     //
  3057.     // It would be OK for dwarves to show up over there, except
  3058.     // that they might run into the bear, a situation for which we don't
  3059.     // have any code.  (This is how the original was as well.)
  3060.     //
  3061. ;
  3062. RicketyBridge: CCR_decoration
  3063.     exists = true
  3064.  
  3065.     sdesc = "rickety bridge"
  3066.     ldesc = "It just looks like an ordinary, but unstable, bridge."
  3067.  
  3068.     xdesc = {
  3069.         if (self.exists) {
  3070.             "A rickety wooden bridge extends across the 
  3071.             chasm, vanishing into the mist."; P();
  3072.  
  3073.             I(); "A sign posted on the bridge reads, 
  3074.             \"Stop! Pay troll!\"";
  3075.         }
  3076.         else {
  3077.             "The wreckage of a bridge (and a dead bear) 
  3078.             can be seen at the bottom of the chasm.";
  3079.         }
  3080.     }
  3081.  
  3082.     noun = 'bridge'
  3083.     adjective = 'rickety' 'unstable' 'wobbly' 'rope'
  3084.  
  3085.     locationOK = true    // tell compiler OK for location to be method
  3086.     location = {
  3087.         if (self.exists) {
  3088.             if (Me.isIn(On_Sw_Side_Of_Chasm))
  3089.                 return On_Sw_Side_Of_Chasm;
  3090.             else
  3091.                 return On_Ne_Side_Of_Chasm;
  3092.         }
  3093.         else
  3094.             return nil;
  3095.     }
  3096.  
  3097.     verDoCross(actor) = {}
  3098.     doCross(actor) = {
  3099.         if (self.exists) {
  3100.             if (Troll.ispaid or Troll.location = nil)
  3101.                 self.cross;
  3102.             else {
  3103.                 if (Troll.isIn(self.location)) {
  3104.                     "The troll refuses to let you 
  3105.                     cross.";
  3106.                 }
  3107.                 else {
  3108.                     "The troll steps out from 
  3109.                     beneath the bridge and blocks 
  3110.                     your way.";
  3111.  
  3112.                     Troll.moveInto(self.location);
  3113.                 }
  3114.             }
  3115.         }
  3116.         else
  3117.             "There is no longer any way across the chasm.";
  3118.     }
  3119.  
  3120.     cross = {
  3121.         if (Bear.isfollowing) {
  3122.             "Just as you reach the other side, the bridge 
  3123.             buckles beneath the weight of the bear, which 
  3124.             was still following you around.  You scrabble 
  3125.             desperately for support, but as the bridge 
  3126.             collapses you stumble back and fall into the 
  3127.             chasm.";
  3128.  
  3129.             // Get rid of the bridge in case the
  3130.             // player gets reincarnated and
  3131.             // continues the game.
  3132.             self.exists := nil;
  3133.  
  3134.             // No more bear!
  3135.             Bear.exists := nil;
  3136.  
  3137.             die();
  3138.         }
  3139.         else if (Me.isIn(On_Sw_Side_Of_Chasm)) {
  3140.             Troll.ispaid := nil;
  3141.             Me.travelTo(On_Ne_Side_Of_Chasm);
  3142.         }
  3143.         else {
  3144.             Troll.ispaid := nil;
  3145.             Me.travelTo(On_Sw_Side_Of_Chasm);
  3146.         }
  3147.     }
  3148. ;
  3149. Troll: Actor
  3150.     ispaid = nil
  3151.  
  3152.     sdesc = "burly troll"
  3153.     ldesc = {
  3154.         "Trolls are close relatives with rocks and have skin 
  3155.         as tough as that of a rhinoceros.";
  3156.     }
  3157.  
  3158.     actorDesc = {
  3159.         P(); I();
  3160.         "A burly troll stands by the bridge and insists you 
  3161.         throw him a treasure before you may cross.";
  3162.     }
  3163.  
  3164.     noun = 'troll'
  3165.     adjective = 'burly'
  3166.  
  3167.     location = On_Sw_Side_Of_Chasm
  3168.  
  3169.     verDoKick(actor) = {}
  3170.     doKick(actor) = {
  3171.         "The troll laughs alound at your pitiful attempt
  3172.         to injure him.";
  3173.     }
  3174.  
  3175.     verDoAttack(actor) = {
  3176.         "The troll fends off your blows effortlessly.";
  3177.     }
  3178.     verDoAttackWith(actor, io) = {}
  3179.     doAttackWith(actor, io) = {
  3180.         //
  3181.         // If the player throws the axe at the troll,
  3182.         // he just catches it.
  3183.         //
  3184.         if (io = axe)
  3185.             self.ioGiveTo(actor, io);
  3186.         else
  3187.             self.verDoAttack(actor);
  3188.     }
  3189.  
  3190.     verIoGiveTo(actor) = {}
  3191.     ioGiveTo(actor, dobj) = {
  3192.         if (dobj.istreasure) {
  3193.             "The troll catches your treasure and scurries 
  3194.             away out of sight.";
  3195.  
  3196.             dobj.moveInto(nil);
  3197.             self.ispaid := true;
  3198.         }
  3199.         else if( dobj = tasty_food) {
  3200.             self.doFeed(Me);
  3201.         }
  3202.         else {
  3203.             "The troll deftly catches "; dobj.thedesc;
  3204.             ", examines it carefully, and tosses it back, 
  3205.             declaring, \"Good workmanship, but it's not 
  3206.             valuable enough.\"";
  3207.         }
  3208.     }
  3209.  
  3210.     verIoThrowAt(actor) = { self.verIoGiveTo(actor); }
  3211.     ioThrowAt(actor, dobj) = { self.ioGiveTo(actor, dobj); }
  3212.     verIoThrowTo(actor) = { self.verIoGiveTo(actor); }
  3213.     ioThrowTo(actor, dobj) = { self.ioGiveTo(actor, dobj); }
  3214.  
  3215.     verDoFeed(actor) = {}
  3216.     doFeed(actor) = {
  3217.         if (tasty_food.isIn(Me)) {
  3218.             "Gluttony is not of the troll's vices. 
  3219.             Avarice, however, is.";
  3220.         }
  3221.         else {
  3222.             "You have nothing the troll wants to eat.";
  3223.         }
  3224.     }
  3225. ;
  3226.  
  3227. In_Sloping_Corridor: CCR_room
  3228.     sdesc = "In Sloping Corridor"
  3229.     ldesc = {
  3230.         I(); "You are in a long winding corridor sloping out 
  3231.         of sight in both directions.";
  3232.     }
  3233.     down = In_Large_Low_Room
  3234.     up = On_Sw_Side_Of_Chasm
  3235. ;
  3236.  
  3237. In_Secret_Canyon: CCR_room
  3238.     enteredfrom = nil
  3239.  
  3240.     sdesc = "In Secret Canyon"
  3241.     ldesc = {
  3242.         I(); "You are in a secret canyon which exits to the 
  3243.         north and east."; P();
  3244.  
  3245.         I();
  3246.         if (Dragon.isIn(self))
  3247.             "A huge green fierce dragon bars the way!";
  3248.         else
  3249.             DragonCorpse.ldesc;
  3250.     }
  3251.     north = {
  3252.         if (self.enteredfrom = In_Secret_N_S_Canyon_0) {
  3253.             return self.enteredfrom;
  3254.         }
  3255.         else {
  3256.             if (self.dragoncheck)
  3257.                 return In_Secret_N_S_Canyon_0;
  3258.             else
  3259.                 return nil;
  3260.         }
  3261.     }
  3262.     east = {
  3263.         if (self.enteredfrom = In_Secret_E_W_Canyon) {
  3264.             return self.enteredfrom;
  3265.         }
  3266.         else {
  3267.             if (self.dragoncheck)
  3268.                 return In_Secret_E_W_Canyon;
  3269.             else
  3270.                 return nil;
  3271.         }
  3272.     }
  3273.  
  3274.     forwards = {
  3275.         if (self.enteredfrom = In_Secret_N_S_Canyon_0)
  3276.             return self.east;
  3277.         else
  3278.             return self.north;
  3279.     }
  3280.     out = {
  3281.         if (self.enteredfrom = In_Secret_N_S_Canyon_0)
  3282.             return self.north;
  3283.         else
  3284.             return self.east;
  3285.     }
  3286.  
  3287.     dragoncheck = {
  3288.         if (Dragon.isIn(self)) {
  3289.             "The dragon looks rather nasty.  You'd best 
  3290.             not try to get by.";
  3291.  
  3292.             return nil;
  3293.         }
  3294.         else
  3295.             return true;
  3296.     }
  3297.  
  3298.     //
  3299.     // Let NPC's by the dragon without incident (they're all on
  3300.     // the same team, after all).
  3301.     //
  3302.     NPCexit1 = In_Secret_N_S_Canyon_0
  3303.     NPCexit2 = In_Secret_E_W_Canyon
  3304. ;
  3305. Dragon: CCR_decoration
  3306.     rhetoricalturn = -999    // hack -- see yesVerb in ccr-verbs.t
  3307.     
  3308.     sdesc = "dragon"
  3309.     ldesc = "I wouldn't mess with it if I were you."
  3310.     location = In_Secret_Canyon
  3311.     noun = 'dragon' 'monster' 'beast' 'lizard'
  3312.     adjective = 'huge' 'green' 'fierce' 'scaly' 'giant' 'ferocious'
  3313.  
  3314.     verDoKick(actor) = {}
  3315.     doKick(actor) = {
  3316.         "Right idea, wrong limb.";
  3317.     }
  3318.  
  3319.     verDoAttack(actor) = {}
  3320.     doAttack(actor) = {
  3321.         "With what?  Your bare hands?";
  3322.         self.rhetoricalturn := global.turnsofar;
  3323.     }
  3324.     verDoAttackWith(actor, io) = {}
  3325.     doAttackWith(actor, io) = {
  3326.         if (io = axe)
  3327.             "The axe bounces harmlessly off the dragon's 
  3328.             thick scales.";
  3329.         else if (io = Hands) {
  3330.             self.kill;
  3331.         }
  3332.         else {
  3333.             "You'd probably be better off using your
  3334.             bare hands than that thing!";
  3335.         }
  3336.     }
  3337.  
  3338.     verIoThrowAt(actor) = { self.verIoGiveTo(actor); }
  3339.     ioThrowAt(actor, dobj) = {
  3340.         if (dobj = axe)
  3341.             self.doAttackWith(actor, dobj);
  3342.         else
  3343.             self.ioGiveTo(actor, dobj);
  3344.     }
  3345.     verIoThrowTo(actor) = { self.verIoGiveTo(actor); }
  3346.     ioThrowTo(actor, dobj) = {
  3347.         if (dobj = axe)
  3348.             self.doAttackWith(actor, dobj);
  3349.         else
  3350.             self.ioGiveTo(actor, dobj);
  3351.     }
  3352.  
  3353.     kill = {
  3354.         "Congratulations!  You have just vanquished a 
  3355.         dragon with your bare hands!  (Unbelievable, 
  3356.         isn't it?)";
  3357.  
  3358.         DragonCorpse.moveInto(self.location);
  3359.         self.moveInto(nil);
  3360.     }
  3361. ;
  3362. DragonCorpse: CCR_decoration
  3363.     sdesc = "dragon"
  3364.     ldesc = {
  3365.         "The body of a huge green dead dragon is lying off to 
  3366.         one side.";
  3367.     }
  3368.     location = nil
  3369.     noun = 'dragon' 'corpse'
  3370.     adjective = 'dead'
  3371.     
  3372.     verDoKick(actor) = { "You've already done enough damage!"; }
  3373.     verDoAttack(actor) = { self.verDoKick(actor); }
  3374.     verDoAttackWith(actor, io) = { self.verDoKick(actor); }
  3375. ;
  3376.  
  3377. On_Ne_Side_Of_Chasm: CCR_room, NoNPC
  3378.     sdesc = "On NE Side of Chasm"
  3379.     ldesc = {
  3380.         I(); "You are on the far side of the chasm.  A 
  3381.         northeast path leads away from the chasm on this 
  3382.         side. ";
  3383.  
  3384.         RicketyBridge.xdesc;
  3385.  
  3386.         if (Troll.location = nil) {
  3387.             P(); I();
  3388.             "The troll is nowhere to be seen.";
  3389.         }
  3390.     }
  3391.     ne = In_Corridor
  3392.  
  3393.     across = { return self.over; }
  3394.     cross = { return self.over; }
  3395.     sw = { return self.over; }
  3396.     over = {
  3397.         RicketyBridge.doCross(Me);
  3398.         return nil;
  3399.     }
  3400.     
  3401.     jump = {
  3402.         if (RicketyBridge.exists) {
  3403.             "I respectfully suggest you go across the 
  3404.             bridge instead of jumping.";
  3405.  
  3406.             return nil;
  3407.         }
  3408.         else
  3409.             return didnt_make_it.death;
  3410.     }
  3411.  
  3412.     fork = At_Fork_In_Path
  3413.     view = At_Breath_Taking_View
  3414.     barren = In_Front_Of_Barren_Room
  3415. ;
  3416.  
  3417. In_Corridor: CCR_room, NoNPC
  3418.     sdesc = "In Corridor"
  3419.     ldesc = {
  3420.         I(); "You're in a long east/west corridor.  A faint 
  3421.         rumbling noise can be heard in the distance.";
  3422.     }
  3423.     west = On_Ne_Side_Of_Chasm
  3424.     east = At_Fork_In_Path
  3425.     fork = At_Fork_In_Path
  3426.     view = At_Breath_Taking_View
  3427.     barren = In_Front_Of_Barren_Room
  3428. ;
  3429.  
  3430. At_Fork_In_Path: CCR_room, NoNPC
  3431.     sdesc = "At Fork in Path"
  3432.     ldesc = {
  3433.         I(); "The path forks here.  The left fork leads 
  3434.         northeast.  A dull rumbling seems to get louder in 
  3435.         that direction.  The right fork leads southeast down 
  3436.         a gentle slope.  The main corridor enters from the 
  3437.         west.";
  3438.     }
  3439.     west = In_Corridor
  3440.     ne = At_Junction_With_Warm_Walls
  3441.     left = At_Junction_With_Warm_Walls
  3442.     se = In_Limestone_Passage
  3443.     right = In_Limestone_Passage
  3444.     down = In_Limestone_Passage
  3445.     view = At_Breath_Taking_View
  3446.     barren = In_Front_Of_Barren_Room
  3447. ;
  3448.  
  3449. At_Junction_With_Warm_Walls: CCR_room, NoNPC
  3450.     sdesc = "At Junction With Warm Walls"
  3451.     ldesc = {
  3452.         I(); "The walls are quite warm here.  From the north 
  3453.         can be heard a steady roar, so loud that the entire 
  3454.         cave seems to be trembling.  Another passage leads 
  3455.         south, and a low crawl goes east.";
  3456.     }
  3457.     south = At_Fork_In_Path
  3458.     fork = At_Fork_In_Path
  3459.     north = At_Breath_Taking_View
  3460.     view = At_Breath_Taking_View
  3461.     east = In_Chamber_Of_Boulders
  3462.     crawl = In_Chamber_Of_Boulders
  3463. ;
  3464.  
  3465. At_Breath_Taking_View: CCR_room, NoNPC
  3466.     sdesc = "At Breath-Taking View"
  3467.     ldesc = {
  3468.         I(); "You are on the edge of a breath-taking view. Far 
  3469.         below you is an active volcano, from which great 
  3470.         gouts of molten lava come surging out, cascading back 
  3471.         down into the depths.  The glowing rock fills the 
  3472.         farthest reaches of the cavern with a blood-red 
  3473.         glare, giving everything an eerie, macabre 
  3474.         appearance. The air is filled with flickering sparks 
  3475.         of ash and a heavy smell of brimstone.  The walls are 
  3476.         hot to the touch, and the thundering of the volcano 
  3477.         drowns out all other sounds.  Embedded in the jagged 
  3478.         roof far overhead are myriad twisted formations 
  3479.         composed of pure white alabaster, which scatter the 
  3480.         murky light into sinister apparitions upon the walls. 
  3481.         To one side is a deep gorge, filled with a bizarre 
  3482.         chaos of tortured rock which seems to have been 
  3483.         crafted by the devil himself.  An immense river of 
  3484.         fire crashes out from the depths of the volcano, 
  3485.         burns its way through the gorge, and plummets into a 
  3486.         bottomless pit far off to your left.  To the right, 
  3487.         an immense geyser of blistering steam erupts 
  3488.         continuously from a barren island in the center of a 
  3489.         sulfurous lake, which bubbles ominously.  The far 
  3490.         right wall is aflame with an incandescence of its 
  3491.         own, which lends an additional infernal splendor to 
  3492.         the already hellish scene.  A dark, forboding passage 
  3493.         exits to the south.";
  3494.     }
  3495.     south = At_Junction_With_Warm_Walls
  3496.     passage = At_Junction_With_Warm_Walls
  3497.     out = At_Junction_With_Warm_Walls
  3498.     fork = At_Fork_In_Path
  3499.     jump = { return self.down; }
  3500.     down = {
  3501.         "Don't be ridiculous!";
  3502.         return nil;
  3503.     }
  3504. ;
  3505. Volcano: decoration
  3506.     sdesc = "active volcano"
  3507.     ldesc = {
  3508.         "Great gouts of molten lava come surging out of the 
  3509.         volvano and go cascading back down into the depths.  
  3510.         The glowing rock fills the farthest reaches of the 
  3511.         cavern with a blood-red glare, giving everything an 
  3512.         eerie, macabre appearance.";
  3513.     }
  3514.     location = At_Breath_Taking_View
  3515.     noun = 'volcano' 'rock'
  3516.     adjective = 'active' 'glowing' 'blood' 'blood-red' 'red' 'eerie'
  3517.         'macabre'
  3518. ;
  3519. Sparks: decoration
  3520.     sdesc = "sparks of ash"
  3521.     adesc = { self.sdesc; }
  3522.     ldesc = {
  3523.         "The sparks too far away for you to get a good look at 
  3524.         them.";
  3525.     }
  3526.     location = At_Breath_Taking_View
  3527.     noun = 'spark' 'sparks' 'ash' 'air'
  3528.     adjective = 'flickering'
  3529. ;
  3530. JaggedRoof: decoration
  3531.     sdesc = "jagged roof"
  3532.     ldesc = {
  3533.         "Embedded in the jagged roof far overhead are myriad 
  3534.         twisted formations composed of pure white alabaster, 
  3535.         which scatter the murky light into sinister 
  3536.         apparitions upon the walls.";
  3537.     }
  3538.     location = At_Breath_Taking_View
  3539.     noun = 'roof' 'formations' 'light' 'apparaitions'
  3540.     adjective = 'jagged' 'twsited' 'murky' 'sinister'
  3541. ;
  3542. DeepGorge: decoration
  3543.     sdesc = "deep gorge"
  3544.     ldesc = {
  3545.         "The gorge is filled with a bizarre chaos of tortured 
  3546.         rock which seems to have been crafted by the devil 
  3547.         himself.";
  3548.     }
  3549.     location = At_Breath_Taking_View
  3550.     noun = 'gorge' 'chaos' 'rock'
  3551.     adjective = 'deep' 'bizarre' 'tortured'
  3552. ;
  3553. RiverOfFire: decoration
  3554.     sdesc = "river of fire"
  3555.     ldesc = {
  3556.         "The river of fire crashes out from the depths of the 
  3557.         volcano, burns its way through the gorge, and 
  3558.         plummets into a bottomless pit far off to your 
  3559.         left.";
  3560.     }
  3561.     location = At_Breath_Taking_View
  3562.     noun = 'river' 'fire' 'depth' 'pit'
  3563.     adjective = 'fire' 'firey' 'bottomless'
  3564. ;
  3565. Geyser: decoration
  3566.     sdesc = "immense geyser"
  3567.     ldesc = {
  3568.         "The geyser of blistering steam erupts continuously 
  3569.         from a barren island in the center of a sulfurous 
  3570.         lake, which bubbles ominously.";
  3571.     }
  3572.     location = At_Breath_Taking_View
  3573.     noun = 'geyser' 'steam' 'island' 'lake'
  3574.     adjective = 'immense' 'blistering' 'barren' 'sulfrous'
  3575.         'sulferous' 'sulpherous' 'sulphrous' 'bubbling'
  3576. ;
  3577.  
  3578. In_Chamber_Of_Boulders: CCR_room, NoNPC
  3579.     sdesc = "In Chamber of Boulders"
  3580.     ldesc = {
  3581.         I(); "You are in a small chamber filled with large 
  3582.         boulders.  The walls are very warm, causing the air 
  3583.         in the room to be almost stifling from the heat.  The 
  3584.         only exit is a crawl heading west, through which is 
  3585.         coming a low rumbling.";
  3586.     }
  3587.     west = At_Junction_With_Warm_Walls
  3588.     out = At_Junction_With_Warm_Walls
  3589.     crawl = At_Junction_With_Warm_Walls
  3590.     fork = At_Fork_In_Path
  3591.     view = At_Breath_Taking_View
  3592. ;
  3593. ChamberBoulders: CCR_decoration
  3594.     sdesc = "boulders"
  3595.     ldesc = "They're just ordinary boulders.  They're warm."
  3596.     noun = 'boulder' 'boulders' 'rocks' 'stones'
  3597.     location = In_Chamber_Of_Boulders
  3598. ;
  3599.  
  3600. In_Limestone_Passage: CCR_room, NoNPC
  3601.     sdesc = "In Limestone Passage"
  3602.     ldesc = {
  3603.         I(); "You are walking along a gently sloping 
  3604.         north/south passage lined with oddly shaped limestone 
  3605.         formations.";
  3606.     }
  3607.     north = At_Fork_In_Path
  3608.     up = At_Fork_In_Path
  3609.     fork = At_Fork_In_Path
  3610.     south = In_Front_Of_Barren_Room
  3611.     down = In_Front_Of_Barren_Room
  3612.     barren = In_Front_Of_Barren_Room
  3613.     view = At_Breath_Taking_View
  3614. ;
  3615. LimestoneFormations: decoration
  3616.     sdesc = "limestone formations"
  3617.     ldesc = {
  3618.         "Every now and then a particularly strange shape
  3619.         catches your eye.";
  3620.     }
  3621.     location = In_Limestone_Passage
  3622.     noun = 'formations' 'shape' 'shapes'
  3623.     adjective = 'lime' 'limestone' 'stone' 'oddly' 'shaped'
  3624.         'oddly-shaped'
  3625. ;
  3626.  
  3627.  
  3628. In_Front_Of_Barren_Room: CCR_room, NoNPC
  3629.     sdesc = "In Front of Barren Room"
  3630.     ldesc = {
  3631.         I(); "You are standing at the entrance to a large, 
  3632.         barren room.  A sign posted above the entrance reads: 
  3633.         \"Caution!  Bear in room!\"";
  3634.     }
  3635.     west = In_Limestone_Passage
  3636.     up = In_Limestone_Passage
  3637.     fork = At_Fork_In_Path
  3638.     east = In_Barren_Room
  3639.     in = In_Barren_Room
  3640.     barren = In_Barren_Room
  3641.     enter = In_Barren_Room
  3642.     view = At_Breath_Taking_View
  3643. ;
  3644. BarrenSign: CCR_decoration, readable
  3645.     sdesc = "sign"
  3646.     ldesc = { self.readdesc; }
  3647.     readdesc = {
  3648.         "The sign reads, \"Caution!  Bear in room!\"";
  3649.     }
  3650.  
  3651.     noun = 'sign'
  3652.     adjective = 'barren' 'room'
  3653.  
  3654.     location = In_Front_Of_Barren_Room
  3655. ;
  3656.  
  3657. In_Barren_Room: CCR_room, NoNPC
  3658.     sdesc = "In Barren Room"
  3659.     ldesc = {
  3660.         I(); "You are inside a barren room.  The center of 
  3661.         the room is completely empty except for some dust.  
  3662.         Marks in the dust lead away toward the far end of the 
  3663.         room.  The only exit is the way you came in.";
  3664.     }
  3665.     west = In_Front_Of_Barren_Room
  3666.     out = In_Front_Of_Barren_Room
  3667.     fork = At_Fork_In_Path
  3668.     view = At_Breath_Taking_View
  3669. ;
  3670. Dust: CCR_decoration
  3671.     sdesc = "dust"
  3672.     ldesc = { "It just looks like ordinary dust."; }
  3673.     location = In_Barren_Room
  3674.     noun = 'dust' 'marks'
  3675. ;
  3676. Bear: Actor
  3677.     rhetoricalturn = -999    // hack -- see yesVerb in ccr-verbs.t
  3678.  
  3679.     exists = true
  3680.  
  3681.     istame = nil        // has the bear been fed?
  3682.     isfollowing = nil    // is the bear following the player?
  3683.     wasreleased = nil    // has the bear been unchained yet?
  3684.  
  3685.     sdesc = "large bear"
  3686.     ldesc = {
  3687.         "The bear is extremely large, ";
  3688.  
  3689.         if (self.istame)
  3690.             "but appears to be friendly.";
  3691.         else
  3692.             "and seems quite ferocious!";
  3693.     }
  3694.  
  3695.     //
  3696.     // Can't use actorDesc because we our location is a method,
  3697.     // so we're not ever really contained in a room.  We've
  3698.     // hacked adv.t to make this work by checking the bear
  3699.     // explicitly.
  3700.     //
  3701.     actorDesc = {
  3702.         if (self.isIn(Me.location)) {
  3703.             P(); I();
  3704.  
  3705.             if (self.isfollowing) {
  3706.                 "You are being followed by a very 
  3707.                 large, tame bear.";
  3708.             }
  3709.             else if (self.istame) {
  3710.                 if (not self.wasreleased and
  3711.                 self.isIn(In_Barren_Room)) {
  3712.  
  3713.                     "There is a gentle cave bear 
  3714.                     sitting placidly in one 
  3715.                     corner.";
  3716.                 }
  3717.                 else
  3718.                     "There is a contented-looking 
  3719.                     bear wandering about 
  3720.                     nearby.";
  3721.             }
  3722.             else {
  3723.                 "There is a ferocious cave bear 
  3724.                 eyeing you from the far end of the 
  3725.                 room!";
  3726.             }
  3727.         }
  3728.     }
  3729.  
  3730.     noun = 'bear'
  3731.     adjective = 'large' 'tame' 'ferocious' 'cave'
  3732.  
  3733.     locationOK = true    // tell compiler OK for location to be method
  3734.     location = {
  3735.         if (self.exists) {
  3736.             if (self.isfollowing)
  3737.                 return Me.location;
  3738.             else
  3739.                 return In_Barren_Room;
  3740.         }
  3741.         else
  3742.             return nil;
  3743.     }
  3744.  
  3745.     verDoKick(actor) =  {
  3746.         if (self.istame)
  3747.             self.onlyfriend;
  3748.         else
  3749.             "You obviously have not fully grasped the 
  3750.             gravity of the situation.  Do get a grip on 
  3751.             yourself.";
  3752.     }
  3753.     verDoAttack(actor) = {
  3754.         if (self.istame)
  3755.             self.onlyfriend;
  3756.         else if (not axe.isIn(Me))
  3757.             self.bearhands;
  3758.     }
  3759.     doAttack(actor) = { self.doAttackWith(actor, axe); }
  3760.  
  3761.     verDoAttackWith(actor, io) = {
  3762.         if (self.istame)
  3763.             self.onlyfriend;
  3764.     }
  3765.     doAttackWith(actor, io) = {
  3766.         //
  3767.         // If the player throws the axe at the bear, the
  3768.         // axe misses and becomes inaccessible.  (Doh!)
  3769.         //
  3770.         if (io = axe) {
  3771.             "The axe misses and lands near the bear where 
  3772.             you can't get at it.";
  3773.  
  3774.             axe.moveInto(self.location);
  3775.             axe.nograb := true;        // little hack
  3776.         }
  3777.         else if (io = Hands)
  3778.             self.nicetry;
  3779.         else
  3780.             self.verDoAttack(actor);
  3781.     }
  3782.  
  3783.     onlyfriend = {
  3784.         "The bear is confused; he only wants to be your 
  3785.         friend.";
  3786.     }
  3787.     bearhands = {
  3788.         "With what?  Your bare hands?  Against *his* bear 
  3789.         hands??";
  3790.  
  3791.         self.rhetoricalturn := global.turnsofar;
  3792.     }
  3793.     nicetry = {
  3794.         "Nice try, but sorry.";
  3795.     }
  3796.     
  3797.     verIoGiveTo(actor) = {}
  3798.     ioGiveTo(actor, dobj) = {
  3799.         if (dobj = tasty_food) {
  3800.             self.doFeed(Me);
  3801.         }
  3802.         else {
  3803.             if (self.istame)
  3804.                 "The bear doesn't seem very 
  3805.                 interested in your offer.";
  3806.             else
  3807.                 "Uh-oh -- your offer only makes the bear 
  3808.                 angrier!";
  3809.         }
  3810.     }
  3811.  
  3812.     verIoThrowAt(actor) = { self.verIoGiveTo(actor); }
  3813.     ioThrowAt(actor, dobj) = {
  3814.         if (dobj = axe)
  3815.             self.doAttackWith(actor, dobj);
  3816.         else
  3817.             self.ioGiveTo(actor, dobj);
  3818.     }
  3819.     verIoThrowTo(actor) = { self.verIoGiveTo(actor); }
  3820.     ioThrowTo(actor, dobj) = {
  3821.         if (dobj = axe)
  3822.             self.doAttackWith(actor, dobj);
  3823.         else
  3824.             self.ioGiveTo(actor, dobj);
  3825.     }
  3826.  
  3827.     verDoFeed(actor) = {}
  3828.     doFeed(actor) = {
  3829.         if (tasty_food.isIn(Me)) {
  3830.             "The bear eagerly wolfs down your food, after 
  3831.             which he seems to calm down considerably and 
  3832.             even becomes rather friendly.";
  3833.  
  3834.             tasty_food.moveInto(nil);
  3835.             self.istame := true;
  3836.             axe.nograb := nil;
  3837.         }
  3838.         else if (self.istame) {
  3839.             "You have nothing left to give the bear.";
  3840.         }
  3841.         else {
  3842.             "The bear seems more likely to eat *you*
  3843.             than anything you've got on you!";
  3844.         }
  3845.     }
  3846.  
  3847.     verDoDrop(actor) = {
  3848.         if (not self.isfollowing)
  3849.             "The bear isn't following you.";
  3850.     }
  3851.     doDrop(actor) = {
  3852.         if (Troll.isIn(Me.location)) {
  3853.             "The bear lumbers toward the troll, who lets 
  3854.             out a startled shriek and scurries away.  The 
  3855.             bear soon gives up the pursuit and wanders 
  3856.             back.";
  3857.  
  3858.             Troll.moveInto(nil);
  3859.             self.isfollowing := nil;
  3860.         }
  3861.         else {
  3862.             "The bear wanders away from you.";
  3863.         }
  3864.     }
  3865.  
  3866.     verDoTake(actor) = {
  3867.         if (not self.istame)
  3868.             "Surely you're joking!";
  3869.         else if (not self.wasreleased)
  3870.             "The bear is still chained to the wall.";
  3871.     }
  3872.     doTake(actor) = {
  3873.         self.isfollowing := true;
  3874.         "Ok, the bear's now following you around.";
  3875.     }
  3876. ;
  3877.  
  3878. Different_Maze_3: CCR_room
  3879.     sdesc = "Maze of Twisting Little Passage, All Different"
  3880.     ldesc = {
  3881.         I(); "You are in a maze of twisting little passages, 
  3882.         all different.";
  3883.     }
  3884.     west = Different_Maze_1
  3885.     se = Different_Maze_4
  3886.     nw = Different_Maze_5
  3887.     sw = Different_Maze_6
  3888.     ne = Different_Maze_7
  3889.     up = Different_Maze_8
  3890.     down = Different_Maze_9
  3891.     north = Different_Maze_10
  3892.     south = Different_Maze_11
  3893.     east = Different_Maze_2
  3894. ;
  3895.  
  3896. Different_Maze_4: CCR_room
  3897.     sdesc = "Little Maze of Twisty Passages, All Different"
  3898.     ldesc = {
  3899.         I(); "You are in a little maze of twisty passages, 
  3900.         all different.";
  3901.     }
  3902.     nw = Different_Maze_1
  3903.     up = Different_Maze_3
  3904.     north = Different_Maze_5
  3905.     south = Different_Maze_6
  3906.     west = Different_Maze_7
  3907.     sw = Different_Maze_8
  3908.     ne = Different_Maze_9
  3909.     east = Different_Maze_10
  3910.     down = Different_Maze_11
  3911.     se = Different_Maze_2
  3912. ;
  3913.  
  3914. Different_Maze_5: CCR_room
  3915.     sdesc = "Twisting Maze of Little Passages, All Different"
  3916.     ldesc = {
  3917.         I(); "You are in a twisting maze of little passages, 
  3918.         all different.";
  3919.     }
  3920.     up = Different_Maze_1
  3921.     down = Different_Maze_3
  3922.     west = Different_Maze_4
  3923.     ne = Different_Maze_6
  3924.     sw = Different_Maze_7
  3925.     east = Different_Maze_8
  3926.     north = Different_Maze_9
  3927.     nw = Different_Maze_10
  3928.     se = Different_Maze_11
  3929.     south = Different_Maze_2
  3930. ;
  3931.  
  3932. Different_Maze_6: CCR_room
  3933.     sdesc = "Twisting Little Maze of Passages, All Different"
  3934.     ldesc = {
  3935.         I(); "You are in a twisting little maze of passages, 
  3936.         all different.";
  3937.     }
  3938.     ne = Different_Maze_1
  3939.     north = Different_Maze_3
  3940.     nw = Different_Maze_4
  3941.     se = Different_Maze_5
  3942.     east = Different_Maze_7
  3943.     down = Different_Maze_8
  3944.     south = Different_Maze_9
  3945.     up = Different_Maze_10
  3946.     west = Different_Maze_11
  3947.     sw = Different_Maze_2
  3948. ;
  3949.  
  3950. Different_Maze_7: CCR_room
  3951.     sdesc = "Twisty Little Maze of Passages, All Different"
  3952.     ldesc = {
  3953.         I(); "You are in a twisty little maze of passages, 
  3954.         all different.";
  3955.     }
  3956.     north = Different_Maze_1
  3957.     se = Different_Maze_3
  3958.     down = Different_Maze_4
  3959.     south = Different_Maze_5
  3960.     east = Different_Maze_6
  3961.     west = Different_Maze_8
  3962.     sw = Different_Maze_9
  3963.     ne = Different_Maze_10
  3964.     nw = Different_Maze_11
  3965.     up = Different_Maze_2
  3966. ;
  3967.  
  3968. Different_Maze_8: CCR_room
  3969.     sdesc = "Twisty Maze of Little Passages, All Different"
  3970.     ldesc = {
  3971.         I(); "You are in a twisty maze of little passages, 
  3972.         all different.";
  3973.     }
  3974.     east = Different_Maze_1
  3975.     west = Different_Maze_3
  3976.     up = Different_Maze_4
  3977.     sw = Different_Maze_5
  3978.     down = Different_Maze_6
  3979.     south = Different_Maze_7
  3980.     nw = Different_Maze_9
  3981.     se = Different_Maze_10
  3982.     ne = Different_Maze_11
  3983.     north = Different_Maze_2
  3984. ;
  3985.  
  3986. Different_Maze_9: CCR_room
  3987.     sdesc = "Little Twisty Maze of Passages, All Different"
  3988.     ldesc = {
  3989.         I(); "You are in a little twisty maze of passages, 
  3990.         all different.";
  3991.     }
  3992.     se = Different_Maze_1
  3993.     ne = Different_Maze_3
  3994.     south = Different_Maze_4
  3995.     down = Different_Maze_5
  3996.     up = Different_Maze_6
  3997.     nw = Different_Maze_7
  3998.     north = Different_Maze_8
  3999.     sw = Different_Maze_10
  4000.     east = Different_Maze_11
  4001.     west = Different_Maze_2
  4002. ;
  4003.  
  4004. Different_Maze_10: CCR_room
  4005.     sdesc = "Maze of Little Twisting Passages, All Different"
  4006.     ldesc = {
  4007.         I(); "You are in a maze of little twisting passages, 
  4008.         all different.";
  4009.     }
  4010.     down = Different_Maze_1
  4011.     east = Different_Maze_3
  4012.     ne = Different_Maze_4
  4013.     up = Different_Maze_5
  4014.     west = Different_Maze_6
  4015.     north = Different_Maze_7
  4016.     south = Different_Maze_8
  4017.     se = Different_Maze_9
  4018.     sw = Different_Maze_11
  4019.     nw = Different_Maze_2
  4020. ;
  4021.  
  4022. Different_Maze_11: CCR_room
  4023.     sdesc = "Maze of Little Twisty Passages, All Different"
  4024.     ldesc = {
  4025.         I(); "You are in a maze of little twisty passages, 
  4026.         all different.";
  4027.     }
  4028.     sw = Different_Maze_1
  4029.     nw = Different_Maze_3
  4030.     east = Different_Maze_4
  4031.     west = Different_Maze_5
  4032.     north = Different_Maze_6
  4033.     down = Different_Maze_7
  4034.     se = Different_Maze_8
  4035.     up = Different_Maze_9
  4036.     south = Different_Maze_10
  4037.     ne = Different_Maze_2
  4038. ;
  4039.  
  4040. /*
  4041.  * We don't allow NPC's here because it would be *really* bogus
  4042.  * if the pirate stole the batteries right after the player bought
  4043.  * them.
  4044.  */
  4045. Dead_End_14: CCR_dead_end_room, NoNPC
  4046.     sdesc = "At a Dead End, in Front of a Massive Vending Machine"
  4047.     ldesc = {
  4048.         I(); "You have reached a dead end. There is a massive 
  4049.         vending machine here.";
  4050.  
  4051.         if (PirateMessage.isIn(self)) {
  4052.             P();
  4053.             I(); "Hmmm...  There is a message here 
  4054.             scrawled in the dust in a flowery script.";
  4055.         }
  4056.     }
  4057.  
  4058.     north = Different_Maze_2
  4059.     out = Different_Maze_2
  4060. ;
  4061. VendingMachine: CCR_decoration, readable
  4062.     sdesc = "vending machine"
  4063.     ldesc = { self.readdesc; }
  4064.     readdesc = {
  4065.         "The instructions on the vending machine read, 
  4066.         \"Insert coins to receive fresh batteries.\"";
  4067.     }
  4068.     location = Dead_End_14
  4069.     noun = 'machine' 'slot'
  4070.     adjective = 'vending' 'massive' 'battery' 'coin'
  4071.  
  4072.     verIoPutIn(actor) = {}
  4073.     ioPutIn(actor, dobj) = {
  4074.         if (dobj = rare_coins) {
  4075.             "Soon after you insert the coins in the coin 
  4076.             slot, the vending machines makes a griding 
  4077.             sound, and a set of fresh batteries falls at 
  4078.             your feet.";
  4079.  
  4080.             dobj.moveInto(nil);
  4081.             fresh_batteries.moveInto(self.location);
  4082.         }
  4083.         else {
  4084.             "The machine seems to be designed to take 
  4085.             coins.";
  4086.         }
  4087.     }
  4088.  
  4089.     verDoKick(actor) = {}
  4090.     doKick(actor) = {
  4091.         "<WHUMP!> You boot the machine, but to no avail.";
  4092.     }
  4093.     verDoBreak(actor) = {}
  4094.     doBreak(actor) = {
  4095.         "The machine is quite stury and survives your attack
  4096.         without getting so much as a scratch.";
  4097.     }
  4098.     verDoAttack(actor) = { self.verDoBreak(actor); }
  4099.     doAttack(actor) = { self.doBreak(actor); }
  4100.     verDoAttackWith(actor, io) = { self.verDoAttack(actor); }
  4101.     doAttackWith(actor) = { self.doAttack(actor); }
  4102.  
  4103.     verDoLookbehind(actor) = {
  4104.         "You don't find anything behind the vending machine.";
  4105.     }
  4106.     verDoLookunder(actor) = {
  4107.         "You don't find anything behind the under machine.";
  4108.     }
  4109.     verDoMove(actor) = { "The vending machine is far too heavy to move."; }
  4110. ;
  4111. PirateMessage: CCR_decoration, readable
  4112.     sdesc = "message in the dust"
  4113.     ldesc = {
  4114.         "The message reads, \"This is not the maze where the 
  4115.         pirate leaves his treasure chest.\"";
  4116.     }
  4117.     noun = 'message' 'scrawl' 'writing' 'script'
  4118.     adjective = 'scrawled' 'flowery'
  4119.     location = nil    // moved to Dead_End_14 when pirate spotted
  4120. ;
  4121.  
  4122. /*
  4123.  * Endgame locations
  4124.  *
  4125.  * We make these NoNPC rooms so that dwarves and pirate don't get
  4126.  * teleported here when (if) they get stuck trying to move around
  4127.  * the cave.  (The dwarves in here aren't real actors because they
  4128.  * kill the player immediately if they're awake.)
  4129.  */
  4130. At_Ne_End: CCR_room, lightroom, NoNPC
  4131.     sdesc = "At NE End"
  4132.     ldesc = {
  4133.         I(); "You are at the northeast end of an immense 
  4134.         room, even larger than the giant room.  It appears to 
  4135.         be a repository for the \"Adventure\" program.  
  4136.         Massive torches far overhead bathe the room with 
  4137.         smoky yellow light.  Scattered about you can be seen 
  4138.         a pile of bottles (all of them empty), a nursery of 
  4139.         young beanstalks murmuring quietly, a bed of oysters, 
  4140.         a bundle of black rods with rusty stars on their 
  4141.         ends, and a collection of brass lanterns.  Off to one 
  4142.         side a great many dwarves are sleeping on the floor, 
  4143.         snoring loudly.  A sign nearby reads: \"Do not 
  4144.         disturb the dwarves!\""; P();
  4145.  
  4146.         I(); "An immense mirror is hanging against one wall, 
  4147.         and stretches to the other end of the room, where 
  4148.         various other sundry objects can be glimpsed dimly in 
  4149.         the distance.";
  4150.     }
  4151.     sw = At_Sw_End
  4152. ;
  4153. Mirror_2: CCR_decoration
  4154.     sdesc = "enormous mirror"
  4155.     ldesc = "It looks like an ordinary, albeit enormous, mirror."
  4156.     noun = 'mirror'
  4157.     adjective = 'enormous' 'huge' 'big' 'large' 'suspended'
  4158.         'hanging' 'vanity' 'dwarvish'
  4159.  
  4160.     locationOK = true    // OK for location to be method
  4161.     location = {
  4162.         if (Me.isIn(At_Ne_End))
  4163.             return At_Ne_End;
  4164.         else
  4165.             return At_Sw_End;
  4166.     }
  4167.  
  4168.     verDoBreak(actor) = {}
  4169.     doBreak(actor) = {
  4170.         "You strike the mirror a resounding blow, whereupon 
  4171.         it shatters into a myriad tiny fragments.";
  4172.  
  4173.         //
  4174.         // A very bad move...
  4175.         //
  4176.         end_dwarves();
  4177.     }
  4178.     verDoAttack(actor) = { self.verDoBreak(actor); }
  4179.     doAttack(actor) = { self.doBreak(actor); }
  4180.     verDoAttackWith(actor, io) = { self.verDoAttack(actor); }
  4181.     doAttackWith(actor) = { self.doAttack(actor); }
  4182.     verDoKick(actor) = { self.verDoBreak(actor); }
  4183.     doKick(actor) = { self.doBreak(actor); }
  4184. ;
  4185. RepositoryStuff_1: CCR_decoration
  4186.     sdesc = "collection of adventure game materials"
  4187.     ldesc = {
  4188.         "You've seen everything in here already, albeit
  4189.         in somewhat different contexts.";
  4190.     }
  4191.     location = At_Ne_End
  4192.     noun = 'stuff' 'junk' 'materials' 'torches' 'objects'
  4193.     adjective = 'adventure' 'repository' 'massive' 'sundry'
  4194.  
  4195.     verifyRemove(actor) = {
  4196.         "Realizing that by removing the loot here you'd be 
  4197.         ruining the game for future players, you leave the 
  4198.         \"Adventure\" meterials where they are.";
  4199.     }
  4200. ;
  4201. RepositoryDwarves: CCR_decoration
  4202.     sdesc = "sleeping dwarves"
  4203.     adesc = { self.sdesc; }
  4204.     ldesc = {
  4205.         "I wouldn't bother the dwarves if I were you.";
  4206.     }
  4207.     location = At_Ne_End
  4208.     noun = 'dwarf' 'dwarves'
  4209.     adjective = 'sleeping' 'snoring' 'dozing' 'snoozing'
  4210.  
  4211.     verDoWake(actor) = {}
  4212.     doWake(actor) = {
  4213.         "You prod the nearest dwarf, who wakes up grumpily, 
  4214.         takes one look at you, curses, and grabs for his 
  4215.         axe.";
  4216.  
  4217.         end_dwarves();
  4218.     }
  4219.     verDoAttack(actor) = {}
  4220.     doAttack(actor) = { self.doWake(actor); }
  4221.     verDoKick(actor) = {}
  4222.     doKick(actor) = { self.doWake(actor); }
  4223. ;
  4224. RepositoryPlant: CCR_decoration
  4225.     location = At_Ne_End
  4226. ;
  4227.  
  4228. At_Sw_End: CCR_room, lightroom, NoNPC
  4229.     sdesc = "At SW End"
  4230.     ldesc = {
  4231.         I(); "You are at the southwest end of the repository. 
  4232.         To one side is a pit full of fierce green snakes. On 
  4233.         the other side is a row of small wicker cages, each 
  4234.         of which contains a little sulking bird.  In one 
  4235.         corner is a bundle of black rods with rusty marks on 
  4236.         their ends.  A large number of velvet pillows are 
  4237.         scattered about on the floor. A vast mirror stretches 
  4238.         off to the northeast. At your feet is a large steel 
  4239.         grate, next to which is a sign which reads, 
  4240.         \"TREASURE VAULT. Keys in main office.\"";
  4241.     }
  4242.     ne = At_Ne_End
  4243.     down = {
  4244.         RepositoryGrate.doEnter(Me);
  4245.         return nil;
  4246.     }
  4247. ;
  4248. RepositoryGrate: fixeditem, keyedLockable
  4249.     isopen = nil
  4250.     islocked = true
  4251.     sdesc = "steel grate"
  4252.     ldesc = {
  4253.         "It just looks like an ordinary steel grate.";
  4254.  
  4255.         " It is ";
  4256.         if (self.isopen)
  4257.             "open.";
  4258.         else if (self.islocked) 
  4259.             "closed and locked.";
  4260.         else 
  4261.             "closed.";
  4262.     }
  4263.     noun = 'grate' 'lock' 'gate' 'grille'
  4264.     adjective = 'metal' 'strong' 'steel' 'open' 'closed' 'locked'
  4265.         'unlocked'
  4266.  
  4267.     location = At_Sw_End
  4268.  
  4269.     mykey = nil    // no key for this one
  4270.  
  4271.     verDoEnter(actor) = {}
  4272.     doEnter(actor) = {
  4273.         if (not Grate.islocked) {
  4274.             if (not Grate.isopen) {
  4275.                 "(Opening the grate first.)\b";
  4276.                 Grate.isopen := true;
  4277.                         
  4278.             }
  4279.             if (actor.isIn(Outside_Grate))
  4280.                 actor.travelTo(Below_The_Grate);
  4281.             else
  4282.                 actor.travelTo(Outside_Grate);
  4283.         }
  4284.         else {
  4285.             "You can't go through a locked steel grate!";
  4286.         }
  4287.     }
  4288.     
  4289.     verIoPutIn(actor) = { "You can't put anything in that! "; }
  4290.     verDoPick = { "You have no tools to pick the lock with."; }
  4291. ;
  4292.  
  4293. RepositoryStuff_2: CCR_decoration
  4294.     sdesc = "collection of adventure game materials"
  4295.     ldesc = {
  4296.         "You've seen everything in here already, albeit
  4297.         in somewhat different contexts.";
  4298.     }
  4299.     location = At_Sw_End
  4300.  
  4301.     verifyRemove(actor) = {
  4302.         "Realizing that by removing the loot here you'd be 
  4303.         ruining the game for future players, you leave the 
  4304.         \"Adventure\" meterials where they are.";
  4305.     }
  4306.  
  4307.     noun = 'pit' 'snake' 'snakes' 
  4308.     adjective = 'fierce' 'green'
  4309. ;
  4310.  
  4311. /*
  4312.  * Miscellaneous messages
  4313.  */
  4314. broken_neck: object
  4315.     death = {
  4316.         "You are at the bottom of the pit with a broken neck.";
  4317.         die();
  4318.         return nil;
  4319.     }
  4320. ;
  4321. didnt_make_it: object
  4322.     death = {
  4323.         "You didn't make it.";
  4324.         die();
  4325.         return nil;
  4326.     }
  4327. ;
  4328. crawled_around: object
  4329.     message = {
  4330.         "You have crawled around in some little holes and 
  4331.         wound up back in the main passage.";
  4332.  
  4333.         return nil;
  4334.     }
  4335. ;
  4336. wontfit: object
  4337.     message = {
  4338.         "Something you're carrying won't fit through the 
  4339.         tunnel with you. You'd best take inventory and drop 
  4340.         something.";
  4341.  
  4342.         return nil;
  4343.     }
  4344. ;
  4345.  
  4346. /*
  4347.  * Room feature decorations.
  4348.  * These don't give any new information, but they make the program
  4349.  * seem less brain-damaged.
  4350.  */
  4351. TheRoom: CCR_decoration
  4352.     sdesc = "room"
  4353.     ldesc = {
  4354.         // Upon "examine room" we just give the standard
  4355.         // description for the current location.
  4356.         Me.location.lookAround(true);
  4357.     }
  4358.     noun = 'room' 'anteroom' 'dark-room' 'darkroom'
  4359.     adjective = 'debris' 'low' 'twopit' 'large' 'lighted' 'slab'
  4360.         'giant' 'soft' 'oriental' 'dark' 'immense' 'barren'
  4361.         'bear-in' 'bearin'
  4362.     locationOK = true     // tell compiler OK for location to be method
  4363.     location = {
  4364.         return Me.location;    // always where player is
  4365.     }
  4366. ;
  4367. Hands: CCR_decoration    // the player's hands
  4368.     sdesc = "your hands"
  4369.     adesc = { self.sdesc; }
  4370.     thedesc = { self.sdesc; }
  4371.  
  4372.     ldesc = "The look pretty normal to me."
  4373.  
  4374.     noun = 'hands'
  4375.     adjective = 'my' 'bare' 'hands'
  4376.  
  4377.     locationOK = true     // tell compiler OK for location to be method
  4378.     location = {
  4379.         return Me.location;    // always where player is
  4380.     }
  4381. ;
  4382.  
  4383. class rfd: floatingdecoration
  4384.     ldesc = "You know as much as I do at this point."
  4385. ;
  4386. Crawl: rfd
  4387.     sdesc = "crawl"
  4388.     noun = 'crawl' 'crawls'
  4389.     adjective = 'cobble' 'low' 'wide' 'higher' 'dead' 'end' 'tight'
  4390.     loclist = [
  4391.         Below_The_Grate  In_Cobble_Crawl  In_Debris_Room
  4392.         In_Dirty_Passage  On_Brink_Of_Pit
  4393.         At_West_End_Of_Hall_Of_Mists  At_East_End_Of_Long_Hall
  4394.         At_Complex_Junction  In_Large_Low_Room  Dead_End_Crawl
  4395.         In_Tall_E_W_Canyon  In_Oriental_Room
  4396.         At_Junction_With_Warm_Walls  In_Chamber_Of_Boulders
  4397.     ]
  4398. ;
  4399. Chamber: rfd
  4400.     sdesc = "chamber"
  4401.     noun = 'chamber'
  4402.     adjective = 'small' 'splendid' 'south' 'side' 'west' 'large'
  4403.             'low' 'circular'
  4404.     loclist = [
  4405.         Below_The_Grate  In_Bird_Chamber  In_South_Side_Chamber
  4406.         In_West_Side_Chamber  In_Slab_Room  In_Plover_Room
  4407.         In_Chamber_Of_Boulders
  4408.     ]
  4409. ;
  4410. Passage: rfd
  4411.     sdesc = "passage"
  4412.     noun = 'passage' 'opening' 'openings' 'corridor' 'corridors'
  4413.         'path' 'paths'
  4414.     adjective = 'low' 'wide' 'plugged' 'good' 'east' 'small' 'twisty'
  4415.         'little' 'n/s' 'e/w' 'dirty' 'broken' 'high' 'long'
  4416.         'large' 'walking' 'sizeable' 'sizable' 'cavernous'
  4417.         'blocked' 'immense' 'gently' 'sloping' 'coral'
  4418.         'shallow' 'somewhat' 'steeper' 'dark' 'forboding'
  4419.     loclist = [
  4420.         In_Cobble_Crawl In_Debris_Room 
  4421.         In_Awkward_Sloping_E_W_Canyon In_Bird_Chamber 
  4422.         At_Top_Of_Small_Pit In_Hall_Of_Mists 
  4423.         On_East_Bank_Of_Fissure In_Nugget_Of_Gold_Room 
  4424.         In_Hall_Of_Mt_King At_West_End_Of_Twopit_Room 
  4425.         In_East_Pit In_West_Pit West_Side_Of_Fissure 
  4426.         Low_N_S_Passage In_South_Side_Chamber 
  4427.         In_West_Side_Chamber At_Y2 Jumble_Of_Rock 
  4428.         At_Window_On_Pit_1 In_Dirty_Passage On_Brink_Of_Pit 
  4429.         In_Pit In_Dusty_Rock_Room 
  4430.         At_West_End_Of_Hall_Of_Mists Alike_Maze_1 
  4431.         Alike_Maze_2 Alike_Maze_3 Alike_Maze_4 Dead_End_1 
  4432.         Dead_End_2 Dead_End_3 Alike_Maze_5 Alike_Maze_6 
  4433.         Alike_Maze_7 Alike_Maze_8 Alike_Maze_9 Dead_End_4 
  4434.         Alike_Maze_10 Dead_End_5 At_Brink_Of_Pit Dead_End_6 
  4435.         At_East_End_Of_Long_Hall At_West_End_Of_Long_Hall 
  4436.         Crossover Dead_End_7 At_Complex_Junction In_Bedquilt 
  4437.         In_Swiss_Cheese_Room At_East_End_Of_Twopit_Room 
  4438.         In_Slab_Room In_Secret_N_S_Canyon_0 
  4439.         In_Secret_N_S_Canyon_1 
  4440.         At_Junction_Of_Three_Secret_Canyons In_Large_Low_Room 
  4441.         Dead_End_Crawl 
  4442.         In_Secret_E_W_Canyon In_N_S_Canyon 
  4443.         Canyon_Dead_End In_Tall_E_W_Canyon Dead_End_8 
  4444.         Alike_Maze_11 Dead_End_9 Dead_End_10 Alike_Maze_12 
  4445.         Alike_Maze_13 Dead_End_11 Dead_End_12 Alike_Maze_14 
  4446.         In_Narrow_Corridor At_Steep_Incline_Above_Large_Room 
  4447.         In_Giant_Room At_Recent_Cave_In 
  4448.         In_Immense_N_S_Passage In_Cavern_With_Waterfall 
  4449.         In_Soft_Room In_Oriental_Room In_Misty_Cavern 
  4450.         In_Alcove In_Plover_Room In_Dark_Room In_Arched_Hall 
  4451.         In_Shell_Room In_Ragged_Corridor In_A_Cul_De_Sac 
  4452.         In_Anteroom Different_Maze_1 At_Witts_End 
  4453.         In_Mirror_Canyon At_Window_On_Pit_2 Atop_Stalactite 
  4454.         Different_Maze_2 At_Reservoir Dead_End_13 At_Ne_End 
  4455.         At_Sw_End On_Sw_Side_Of_Chasm In_Sloping_Corridor 
  4456.         In_Secret_Canyon  On_Ne_Side_Of_Chasm In_Corridor 
  4457.         At_Fork_In_Path At_Junction_With_Warm_Walls 
  4458.         At_Breath_Taking_View In_Chamber_Of_Boulders 
  4459.         In_Limestone_Passage In_Front_Of_Barren_Room 
  4460.         In_Barren_Room Different_Maze_3 Different_Maze_4 
  4461.         Different_Maze_5 Different_Maze_6 Different_Maze_7 
  4462.         Different_Maze_8 Different_Maze_9 Different_Maze_10 
  4463.         Different_Maze_11 Dead_End_14
  4464.     ]
  4465. ;
  4466. Canyon: rfd
  4467.     sdesc = "canyon"
  4468.     noun = 'canyon' 'canyons'
  4469.     adjective = 'awkward' 'sloping' 'secret' 'e/w' 'n/s' 'tight'
  4470.             'tall' 'three'
  4471.     loclist = [
  4472.         In_Debris_Room  In_Awkward_Sloping_E_W_Canyon
  4473.         In_Bird_Chamber  In_Secret_N_S_Canyon_0
  4474.         In_Secret_N_S_Canyon_1  At_Junction_Of_Three_Secret_Canyons
  4475.         In_Secret_E_W_Canyon  In_N_S_Canyon
  4476.         Canyon_Dead_End  In_Tall_E_W_Canyon  Dead_End_8
  4477.         In_Mirror_Canyon  In_Secret_Canyon
  4478.     ]
  4479. ;
  4480. Walls: rfd
  4481.     sdesc = "walls"
  4482.     noun = 'wall' 'walls' 'cracks' 'ceiling' 
  4483.     adjective = 'orange' 'stone' 'swiss' 'cheese' 'cave' 'cavern'
  4484.             'ragged' 'sharp' 'canyon' 'warm' 'hot' 'building'
  4485.             'well' 'house' 'wellhouse'
  4486.     loclist = [
  4487.         Inside_Building In_Cobble_Crawl In_Debris_Room 
  4488.         In_Awkward_Sloping_E_W_Canyon In_Bird_Chamber 
  4489.         At_Top_Of_Small_Pit In_Hall_Of_Mists 
  4490.         On_East_Bank_Of_Fissure In_Nugget_Of_Gold_Room 
  4491.         In_Hall_Of_Mt_King At_West_End_Of_Twopit_Room 
  4492.         In_East_Pit In_West_Pit West_Side_Of_Fissure 
  4493.         Low_N_S_Passage In_South_Side_Chamber 
  4494.         In_West_Side_Chamber At_Y2 Jumble_Of_Rock 
  4495.         At_Window_On_Pit_1 In_Dirty_Passage On_Brink_Of_Pit 
  4496.         In_Pit In_Dusty_Rock_Room 
  4497.         At_West_End_Of_Hall_Of_Mists Alike_Maze_1 
  4498.         Alike_Maze_2 Alike_Maze_3 Alike_Maze_4 Dead_End_1 
  4499.         Dead_End_2 Dead_End_3 Alike_Maze_5 Alike_Maze_6 
  4500.         Alike_Maze_7 Alike_Maze_8 Alike_Maze_9 Dead_End_4 
  4501.         Alike_Maze_10 Dead_End_5 At_Brink_Of_Pit Dead_End_6 
  4502.         At_East_End_Of_Long_Hall At_West_End_Of_Long_Hall 
  4503.         Crossover Dead_End_7 At_Complex_Junction In_Bedquilt 
  4504.         In_Swiss_Cheese_Room At_East_End_Of_Twopit_Room 
  4505.         In_Slab_Room In_Secret_N_S_Canyon_0 
  4506.         In_Secret_N_S_Canyon_1 
  4507.         At_Junction_Of_Three_Secret_Canyons In_Large_Low_Room 
  4508.         Dead_End_Crawl 
  4509.         In_Secret_E_W_Canyon In_N_S_Canyon 
  4510.         Canyon_Dead_End In_Tall_E_W_Canyon Dead_End_8 
  4511.         Alike_Maze_11 Dead_End_9 Dead_End_10 Alike_Maze_12 
  4512.         Alike_Maze_13 Dead_End_11 Dead_End_12 Alike_Maze_14 
  4513.         In_Narrow_Corridor At_Steep_Incline_Above_Large_Room 
  4514.         In_Giant_Room At_Recent_Cave_In 
  4515.         In_Immense_N_S_Passage In_Cavern_With_Waterfall 
  4516.         In_Soft_Room In_Oriental_Room In_Misty_Cavern 
  4517.         In_Alcove In_Plover_Room In_Dark_Room In_Arched_Hall 
  4518.         In_Shell_Room In_Ragged_Corridor In_A_Cul_De_Sac 
  4519.         In_Anteroom Different_Maze_1 At_Witts_End 
  4520.         In_Mirror_Canyon At_Window_On_Pit_2 Atop_Stalactite 
  4521.         Different_Maze_2 At_Reservoir Dead_End_13 At_Ne_End 
  4522.         At_Sw_End On_Sw_Side_Of_Chasm In_Sloping_Corridor 
  4523.         In_Secret_Canyon  On_Ne_Side_Of_Chasm  In_Corridor 
  4524.         At_Fork_In_Path At_Junction_With_Warm_Walls 
  4525.         At_Breath_Taking_View In_Chamber_Of_Boulders 
  4526.         In_Limestone_Passage In_Front_Of_Barren_Room 
  4527.         In_Barren_Room Different_Maze_3 Different_Maze_4 
  4528.         Different_Maze_5 Different_Maze_6 Different_Maze_7 
  4529.         Different_Maze_8 Different_Maze_9 Different_Maze_10 
  4530.         Different_Maze_11 Dead_End_14
  4531.     ]
  4532. ;
  4533. DeadEnd: rfd
  4534.     sdesc = "dead end"
  4535.     noun = 'end'
  4536.     adjective = 'dead'
  4537.     loclist = [
  4538.         Dead_End_1 Dead_End_2 Dead_End_3 Dead_End_4 
  4539.         Dead_End_5 Dead_End_6 Dead_End_7 Dead_End_Crawl 
  4540.         Canyon_Dead_End Dead_End_8 Dead_End_9 Dead_End_10 
  4541.         Dead_End_11 Dead_End_12 Dead_End_13 Dead_End_14
  4542.     ]
  4543. ;
  4544. Hall: rfd
  4545.     sdesc = "hall"
  4546.     noun = 'hall'
  4547.     adjective = 'vast' 'long' 'featureless' 'arched'
  4548.     loclist = [
  4549.         In_Hall_Of_Mists  On_East_Bank_Of_Fissure
  4550.         In_Hall_Of_Mt_King  West_Side_Of_Fissure
  4551.         In_West_Side_Chamber  At_West_End_Of_Hall_Of_Mists
  4552.         At_East_End_Of_Long_Hall At_West_End_Of_Long_Hall
  4553.         In_Arched_Hall
  4554.     ]
  4555. ;
  4556. Hole: rfd
  4557.     sdesc = "hole"
  4558.     noun = 'hole' 'holes'
  4559.     adjective = 'large' 'big' 'round' 'two' 'foot' 'two-foot'
  4560.     loclist = [
  4561.         At_East_End_Of_Twopit_Room
  4562.         In_West_Pit  Low_N_S_Passage  In_Dirty_Passage
  4563.         In_Dusty_Rock_Room  At_East_End_Of_Long_Hall
  4564.         In_Bedquilt  In_Narrow_Corridor  In_Cavern_With_Waterfall
  4565.         At_Reservoir
  4566.     ]
  4567. ;
  4568. Junction: rfd
  4569.     sdesc = "junction"
  4570.     noun = 'junction'
  4571.     adjective = 'complex'
  4572.     loclist = [
  4573.         At_Complex_Junction  At_Junction_Of_Three_Secret_Canyons
  4574.         At_Junction_With_Warm_Walls
  4575.     ]
  4576. ;
  4577. Air: rfd    // If they MUST examine EVERYTHING
  4578.     sdesc = "air"
  4579.     adesc = "air"
  4580.     noun = 'air' 'environment' 'atmosphere' 'wind'
  4581.     adjective = 'sea' 'damp' 'hot' 'stifling'
  4582.     locationOK = true     // tell compiler OK for location to be method
  4583.     location = {
  4584.         return Me.location;    // always where player is
  4585.     }
  4586.     verDoSmell(actor) = {}
  4587.     doSmell(actor) = {
  4588.         "The air smells pretty much like you would expect.";
  4589.     }
  4590. ;
  4591.